1

내 데이터베이스에 '피드백'개체의 인스턴스를 저장하고 싶습니다. 피드백 개체에는 '클라이언트'에 대한 외래 키가 있고 관련이있을 수 있으므로 genericforeignkey가 있습니다. 'Vendor'또는 'Store'에 게시하려면 POST를 허용하는 2 개의 URL을 만들고 하나는 공급 업체에 대한 의견을 만들고 다른 하나는 상점에 대한 의견을 작성하고 둘 모두 기본 키를받습니다.DJANGO - 나머지 프레임 워크를 사용하여 POST 메서드에서 genericforeignkey로 데이터 저장

클래스 다이어그램 예 : Class Diagram

이 내 방법입니다 :

@api_view(['POST']) 
def store_feedback_view(request, store_id): 
    serializer = FeedbackSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

시리얼 라이저는 유효하지만 나에게 다음과 같은 오류주고 저장하는 중 :

NOT NULL constraint failed: feedback_feedback.object_id 
NOT NULL constraint failed: feedback_feedback.content_type_id 

이를 피드백 개체의 NULL이 아닌 genericforeignkey가 있기 때문에 발생합니다.

class Feedback(models.Model): 
    comment = models.TextField(verbose_name='Comment', max_length=300, blank=True, null=True) 
    client = models.ForeignKey(Client, verbose_name="Client feedback", related_name="feedbacks") 

    limit = models.Q(app_label='core', model='store') | models.Q(app_label='core', model='vendor') 
    content_type = models.ForeignKey(ContentType, 
            limit_choices_to=limit) 
    object_id = models.PositiveIntegerField(verbose_name="Related object ID") 
    content_object = GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     app_label = 'feedback' 

POST 메서드에서 어떻게 피드백 개체를 만들 수 있습니까?

이 serializer.object하는 feedback/store/(?P<store_id>\d+)/

{ 
    "comment": "Nice store", 
    "client": 1 
} 

답변

3

설정 저장소에 요청의 예입니다

@api_view(['POST']) 
def store_feedback_view(request, store_id): 
    serializer = FeedbackSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     # this line added: 
     serializer.object.content_object = get_object_or_404(Store, id=store_id) 
     serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
+0

은 믿을 수 없다, 내 문제를 해결! –

+0

이것은 DRF 3.0 이전의 DRF 버전입니다. 이것이 3.0+에서 어떻게 처리되어야하는지에 관해서는 여기를보십시오 : http://stackoverflow.com/a/13564519/2133271 – IAmKale

관련 문제