【问题标题】:Django Postman error this field is requiredDjango Postman 错误此字段是必需的
【发布时间】:2020-06-02 09:20:33
【问题描述】:

我明白了

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

当我通过

向本地 Django 发送 POST 请求时

http://localhost:8000/api/franchise/charge/

我将以下 2 个字段作为 Postman 的正文发送

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

网址

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

我需要做什么来解决这个问题?

【问题讨论】:

    标签: django


    【解决方案1】:

    您正在使用嵌套序列化程序,因此它的数据应该是嵌套在数据中的 json 对象。

    如我所见,您使用的是 RelationModelSerializer - 如果它对应于链接文章中描述的那个 - 它还建议将相关模型 pk 字段名称放入嵌套 json 中:

    {
      "price": 1000,
      "franchise": {
        "id": 1
      }
    }
    

    对于常规的 DRF 嵌套序列化程序 - 一种选择是使用不同的序列化程序进行读取和写入。这样就可以在没有嵌套序列化器的情况下配置写入序列化器,只需在特许经营字段中直接接受特许经营ID即可。

    检查嵌套序列化程序上的this SO answer

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 2016-04-29
      • 2012-12-02
      • 2019-06-11
      • 2021-04-10
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多