python - Django Rest 框架说非必填字段是必需的
问题描述
背景故事
在 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
和视图集
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}
到序列化程序,考虑到地址字段工作正常,这似乎有点愚蠢。
有谁知道什么会导致这个问题以及如何防止这种情况发生?
解决方案
您需要在 ForeignKey 构造函数中包含blank=True
除了,如下所示:null=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 - python数据框中的平等
- python-3.x - 如何根据其他数据框的行将新列添加到数据框中?
- reactjs - 在反应中动态加载 svgs 作为组件
- spring-integration - 如何处理spring集成中的错误
- jquery - 如何根据 select onChange 事件更新 jQuery datetimepicker
- azure - 如何不为磁盘多收费用?
- react-native - React Native - 警告:可能未处理的承诺拒绝(id:0)
- .net - EPPLus [Nuget] 依赖项
- java - 在方法完成之前未写入 DB 上的 JPA 更改
- objective-c - 连接 airpods 时扬声器不是可用输入