DjangoRestFramework - 如何在不覆盖它的情况下将关系字段添加到序列化程序中?

时间:2015-11-08 23:51:46

标签: django django-rest-framework

这是我的模特:

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=Truenull=True

1)如何在不覆盖它的情况下将message字段添加到序列化程序中?

OR

2)如果DRF在默认情况下将其序列化(例如,如果我没有覆盖它/如果UserExtended拥有它自己的序列化程序),我有办法检查message字段的外观吗?这样,当我覆盖它时,我可以使它与DRF最初如果UserExtended具有序列化器的情况完全相同。

我的意思是#2,通常DRF会自动将required=False添加到message序列化程序字段(因为我的模型字段中为blank=Truenull=True)正在序列化UserExtended(它也可能会自动添加其他东西,我不知道)。但是,因为在我目前的情况下(我不能只将message添加到字段列表中,我只能通过覆盖它并使用source)来实现,我不知道DRF会有什么自动添加required=False以外的序列化程序。

1 个答案:

答案 0 :(得分:0)

@ivan回复是正确的。 DRF没有设置为required = False,因为它比Django表单有更多的可能性。

Django认为空白字段是空输入,因为表单无法区分空值或空字符串。

然而,使用API​​它有点不同:

  1. {}
  2. {'name':无}
  3. {'name':''} -
  4. {'name':'myname'}
  5. 这四个是API的不同用例,而1,2和3似乎与HTML表单相同。因此,我们需要更精细的粒度来查看API允许哪些用例。

    blank = True将允许#3 /#4,null = True将允许#2 /#4和required = True将仅拒绝#1。