这是我的模特:
class UserExtended(models.Model):
user = models.OneToOneField(User)
message = models.CharField(max_length=400, blank=True, null=True)
它与默认的Django User模型具有OneToOneField关系。这是我的UserSerializer:
class UserSerializer(serializers.ModelSerializer):
message = serializers.CharField(source='userextended.message')
class Meta:
model = User
fields = ('username', 'password', 'email', 'message',)
extra_kwargs = {
'password': {
'write_only': True,
},
'email': {
'required': True,
}
}
问题在于,现在DRF认为message
字段是必需的,即使我的模型中有blank=True
和null=True
。
1)如何在不覆盖它的情况下将message
字段添加到序列化程序中?
OR
2)如果DRF在默认情况下将其序列化(例如,如果我没有覆盖它/如果UserExtended拥有它自己的序列化程序),我有办法检查message
字段的外观吗?这样,当我覆盖它时,我可以使它与DRF最初如果UserExtended
具有序列化器的情况完全相同。
我的意思是#2,通常DRF会自动将required=False
添加到message
序列化程序字段(因为我的模型字段中为blank=True
和null=True
)正在序列化UserExtended
(它也可能会自动添加其他东西,我不知道)。但是,因为在我目前的情况下(我不能只将message
添加到字段列表中,我只能通过覆盖它并使用source
)来实现,我不知道DRF会有什么自动添加required=False
以外的序列化程序。
答案 0 :(得分:0)
@ivan回复是正确的。 DRF没有设置为required = False,因为它比Django表单有更多的可能性。
Django认为空白字段是空输入,因为表单无法区分空值或空字符串。
然而,使用API它有点不同:
这四个是API的不同用例,而1,2和3似乎与HTML表单相同。因此,我们需要更精细的粒度来查看API允许哪些用例。
blank = True将允许#3 /#4,null = True将允许#2 /#4和required = True将仅拒绝#1。