【问题标题】:List is working but post is not working in nested serializer in Django Rest Framework列表正在工作,但帖子在 Django Rest Framework 的嵌套序列化程序中不起作用
【发布时间】:2019-08-02 23:27:34
【问题描述】:

这是我的代码:

模型.py

class Kitchen(models.Model):
kitchen_name = models.CharField(max_length = 100)
state = models.CharField(max_length = 40, )
city = models.CharField(max_length = 40)

def __str__(self):
    return self.kitchen_name


class AssignAudit(models.Model):
kitchen = models.ForeignKey(Kitchen, on_delete = models.SET_NULL, null = True)
assigned_date = models.DateTimeField(default = timezone.now)
assigned_by = models.ForeignKey(User, on_delete = models.SET_NULL, null =  True, related_name = 'assigned_audits')

class KitchenAudit(models.Model):
assign_audit = models.ForeignKey(AssignAudit, on_delete = models.SET_NULL, null = True)
question = models.ForeignKey(Question, on_delete = models.SET_NULL, null = True)
total_images = models.IntegerField(null = True, blank = True)
marks_scored = models.IntegerField(null=True,blank=True)
comment = models.CharField(max_length = 300, null = True, blank = True)

序列化器.py

class KitchenSerializer(serializers.ModelSerializer):
class Meta:
    model = Kitchen
    fields = '__all__'

class AssignAuditSerializer(serializers.ModelSerializer):
kitchen = KitchenSerializer()
class Meta:
    model = AssignAudit
    fields = '__all__'

def create(self, validated_data):
    assign_audit = AssignAudit.objects.create(**validated_data)        
    questions = Question.objects.all()
    for question in questions:
        kitchen_audit = KitchenAudit.objects.create(question=question,assign_audit=assign_audit)
        for images in range(question.no_of_images):
            KitchenAuditImage.objects.create(kitchen_audit=kitchen_audit)
    return assign_audit

Views.py

class AssignAuditSerializerListCreate(ListCreateAPIView):
serializer_class = AssignAuditSerializer
queryset = AssignAudit.objects.all()

    def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())
    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)
    serializer = self.get_serializer(queryset, many=True)
    return Response({'audit_assign':serializer.data})

我想使用 django-rest-framework 将上面的两个表格合并到一个 API 中。 GET 方法工作正常,但是当我使用 POST 方法时,它说我必须提供厨房价值。

{
    "kitchen": [
        "This field is required."
    ]
}

【问题讨论】:

  • 能否请您也发布 KitchenAudit 模型?
  • 嗨@matthieu.cham。我已经编辑了这个问题。请参考

标签: python django api django-rest-framework serialization


【解决方案1】:

您设置了read_only = True,这就是它在发布、放置或修补时忽略厨房的原因。它显然是只读的,所以你不能发布到它。

作为替代方案,您可以在视图中覆盖 get_serializer_class() 函数来实现这一点。

【讨论】:

    【解决方案2】:

    一种可能的解决方案是将kitchen 设为只读。

    kitchen = KitchenSerializer(read_only=True)
    

    【讨论】:

    • 在执行 POST 时,它被插入,但分配审计模型的厨房列变为空。
    • 当您可以kitchen_audit 来自KitchenAudit.objects.create 的响应时,您需要手动添加。
    • 厨房 ID 通过 POST 请求传递,并在 AssignAuditSerializer 创建函数的第一行 assign_audit = AssignAudit.objects.create(**validated_data) 处处理。我不知道你想让我怎么处理。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2016-01-18
    • 2018-10-26
    • 2015-04-17
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多