【问题标题】:DJANGO - Save data with genericforeignkey on POST method using rest frameworkDJANGO - 使用 rest 框架在 POST 方法上使用 genericforeignkey 保存数据
【发布时间】:2014-10-21 21:30:16
【问题描述】:

我想在我的数据库中保存一个“反馈”对象的实例,反馈对象有一个“客户”的外键和一个通用的外键,因为它可以与“供应商”或“商店”相关,我做了 2允许 POST 的 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

这是因为反馈对象的 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
}

【问题讨论】:

    标签: python django django-views django-rest-framework generic-foreign-key


    【解决方案1】:

    将 store 设置为 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)
    

    【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2023-03-19
    • 1970-01-01
    • 2015-10-19
    • 2016-12-30
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多