python - Django Rest Framework 说需要非必填字段

标签 python django

背景故事

在 Django 中我有模型

class Company(models.Model):
    name = models.TextField(null=False,unique=True)
    date_added = models.DateTimeField(auto_now_add=True)

class Address(models.Model):
    street = models.TextField()

class Person(models.Model ): 
    firstname = models.TextField()
    address = models.ForeignKey(Address,null= True,on_delete=models.SET_NULL)
    company = models.ForeignKey(Company,null=True,on_delete=models.SET_NULL)

每个人都有地址和公司。(均为非必填字段)

在 DRF 中我有序列化程序。

class AddressSerializer(serializers.ModelSerializer):
    class Meta:
        model = Address
        fields = '__all__'

class CompanySerializer(serializers.ModelSerializer):

    class Meta:
        model = Company
        fields = "__all__"

class PersonSerializer(serializers.ModelSerializer):

    class Meta:
        model = Person
        fields = ('id', 'firstname',  'address','company')

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['address'] = AddressSerializer(instance.address).data
        response['company'] = CompanySerializer(instance.company).data
        return response

和 View 集

class PersonViewSet(viewsets.ModelViewSet,UpdateModelMixin):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer
    filter_backends = (OrderingFilter,DjangoFilterBackend,SearchFilter)
    filter_fields = ('id','company','firstname','middlename','lastname',)
    search_fields = ('firstname','middlename','lastname',)

class CompanyViewSet(viewsets.ModelViewSet,UpdateModelMixin):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer
    filter_backends = (OrderingFilter,DjangoFilterBackend,SearchFilter)
    filter_fields = ('id','name',)
    search_fields = ('name',)

class AddressViewSet(viewsets.ModelViewSet,UpdateModelMixin):
    queryset = Address.objects.all()
    serializer_class = AddressSerializer
    filter_backends = [DjangoFilterBackend]
    filter_fields = ['id','street']

问题

将数据 {"firstname":"foo"} 发送到此序列化程序时,它会返回 400 错误代码。 {"company": ["This field is required."]}.

奇怪的是,地址字段的设置方式与公司字段看似完全相同,但不会引发此错误。

为了让它工作,你必须将 {"firstname":"foo","company":null} 发送到序列化程序,考虑到地址字段的工作,这似乎有点傻就好了。

有没有人知道导致此问题的原因以及如何防止这种情况发生?

最佳答案

除了 null=True 外,您还需要在 ForeignKey 构造函数中包含 blank=True,如下所示:

address = models.ForeignKey(Address,blank=True,null=True,on_delete=models.SET_NULL)
company = models.ForeignKey(Company,blank=True,null=True,on_delete=models.SET_NULL)

关于python - Django Rest Framework 说需要非必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53067449/

相关文章:

python - Haystack搜索字段错误: The model 'None' combined with model_attr <attr_name> returned None

python - 如何找到具有最少步数的元素

python - 如何在pygame中添加背景图像?

django - 无法覆盖 ModelForm (Django) 中的 SelectMultiple 小部件

java - 如何将数据客户端发送到服务器django channel

javascript - 提交前检查 django 中表单的输入

python - nidaqmx:防止任务在功能更改后关闭

python - Flask 脚本 windows 子进程和 sys

python - 为什么在我离开内置运行服务器后 Django 找不到我的管理媒体文件?

python - Django,保存图像,OSError : cannot identify image file