Django Postman错误,该字段是必需的

14 浏览
0 Comments

Django Postman错误,该字段是必需的

当我通过http://localhost:8000/api/franchise/charge/发送POST请求到本地 Django 时,我得到了以下错误信息:

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

我在 Postman 中的请求体中发送了以下两个字段:

key: price       value: 1000
key: franchise   value: 1

URL为:router.register(r'franchise/charge', views.FranchiseChargeViewSet)视图部分如下:

class FranchiseChargeViewSet(viewsets.ModelViewSet):
    queryset = FranchiseCharge.objects.all()
    serializer_class = FranchiseChargeSerializer
    def get_permissions(self):
        permission_classes = []
        if self.action == 'create':
            permission_classes = [IsFranchise]
        elif self.action == 'retrieve':
            permission_classes = [IsFranchise]
        elif self.action == 'list':
            permission_classes = [IsFranchise]
        elif self.action == 'update' or self.action == 'partial_update':
            permission_classes = [IsFranchise]
        elif self.action == 'destroy':
            permission_classes = [IsFranchise]
        return [permission() for permission in permission_classes]

模型如下:

class FranchiseCharge(models.Model):
    franchise = models.ForeignKey(Franchise,null=True,on_delete=models.SET_NULL, default=1)
    time = models.DateTimeField(default=timezone.now)
    price = models.PositiveIntegerField(default=0)

序列化器如下:

class FranchiseChargeSerializer(RelationModelSerializer):
    franchise = FranchiseSerializer(is_relation=True)
    class Meta:
        model = FranchiseCharge
        fields = ('id','franchise','time','price')
    @transaction.atomic
    def create(self, validated_data):
        instance = FranchiseCharge.objects.create(**validated_data)
        return instance

请问我需要做什么来修复这个问题?

0
0 Comments

在使用Django进行开发时,可能会遇到一些错误。其中之一是在使用Postman进行测试时出现错误消息"this field is required"。

出现这个错误的原因是因为在使用嵌套序列化器(nested serializer)时,数据应该是嵌套的JSON对象。

根据我所看到的情况,您正在使用RelationModelSerializer(可能是链接文章中描述的那种) - 它还建议在嵌套的JSON中放入相关模型的主键字段名:

{

"price": 1000,

"franchise": {

"id": 1

}

}

对于常规的DRF嵌套序列化器,可以使用不同的序列化器来进行读取和写入。这样写入的序列化器可以配置为不使用嵌套序列化器,而是直接在franchise字段中接受franchise_id。

可以参考这个SO答案中关于嵌套序列化器的内容。

0