DJANGO - 使用REST框架通过POST方法保存带有GenericForeignKey的数据

1 投票
1 回答
1325 浏览
提问于 2025-04-28 18:59

我想在我的数据库中保存一个“反馈”对象的实例,这个反馈对象有一个指向“客户”的外键,并且还有一个通用外键,因为它可以关联到“供应商”或“商店”。我创建了两个可以接收POST请求的URL,一个是用来给供应商创建反馈,另一个是用来给商店创建反馈,这两个URL都需要接收主键。

这是一个类图的例子:

类图

这是我的做法:

@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

这个错误发生是因为反馈对象的通用外键不为空:

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
}
暂无标签

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)

撰写回答