1

データベースに「フィードバック」オブジェクトのインスタンスを保存したいと思います。フィードバック オブジェクトには「クライアント」への外部キーと、「ベンダー」または「ストア」に関連する可能性があるためジェネリック外部キーがあります。許可する 2 つの URL を作成しました。 1 つはベンダーへのフィードバックを作成するため、もう 1 つはストアへのフィードバックを作成するための POST で、どちらも主キーを受け取ります。

クラス図の例: クラス図

これが私のアプローチです:

@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

これは、フィードバック オブジェクトの genericforeignkey が NULL ではないために発生します。

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 メソッドでフィードバックのオブジェクトを作成するにはどうすればよいですか?

でのご依頼の一例ですfeedback/store/(?P<store_id>\d+)/

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

1 に答える 1

3

ストアを serializer.object に設定します。

@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)
于 2014-10-21T13:30:16.063 に答える