【问题标题】:DjangoRestFramework - How to add relational field to serializer without overriding it?DjangoRestFramework - 如何将关系字段添加到序列化程序而不覆盖它?
【发布时间】:2015-11-08 23:51:46
【问题描述】:

这是我的模型:

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 字段添加到序列化程序而不覆盖它?

2) 如果 DRF 默认对其进行序列化(即如果我没有覆盖它/如果 UserExtended 有它自己的序列化程序),我有没有办法检查 message 字段的外观?这样,当我重写它时,我可以使它与 UserExtended 有序列化器时 DRF 最初的方式完全相同。

我所说的#2 的意思是,如果我正在序列化UserExtended(它可能还会自动添加我不知道的其他内容)。但是,因为在我目前的情况下(我不能只将 message 添加到字段列表中,我只能通过覆盖它并使用 source 来做到这一点),我不知道除了 DRF 还会自动添加什么required=False 到序列化器。

【问题讨论】:

  • @Ivan 抱歉,我的意思是 DRF 会将 required=False 添加到我的 message 序列化器字段(如果我正在序列化 UserExtended),因为我模型中的 message 字段具有 @ 987654343@.

标签: django django-rest-framework


【解决方案1】:

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

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

但是,API 有点不同:

  1. {}
  2. {'name': 无}
  3. {'name': ''} -
  4. {'name': '我的名字'}

这四个是 API 的不同用例,而 1、2 和 3 似乎与 HTML 表单相同。因此,我们需要更细粒度地查看 API 允许哪些用例。

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

【讨论】:

  • 对,有道理。无论如何,我如何将关系字段添加到序列化程序而不覆盖该字段?
  • 你能告诉我如何使用extra_kwargs 来完成我需要的工作吗?根据我的理解,我阅读了您链接的内容,extra_kwargs 只是将现有字段名称映射到关键字参数,但我想要的是能够将关系字段添加到序列化程序而不覆盖它。
  • 在您的用例中,您不能。这是因为您正在跨越一个关系并使其看起来好像是“平坦的”,因此 DRF 不会自动处理它。唯一可能发生这种情况的情况是使用 SlugRelatedField,您可以在其中提供一个唯一字段作为主键的替代项。
  • 并不是说您既没有覆盖序列化程序也没有覆盖该字段。如上所述,您正在定义一个不存在的新字段。
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2015-07-22
  • 2014-02-03
相关资源
最近更新 更多