【问题标题】:DjangoRestFramework - How do I check if an optional serializer field exists in valiated_data?DjangoRestFramework - 如何检查 valied_data 中是否存在可选的序列化程序字段?
【发布时间】:2015-10-06 22:55:28
【问题描述】:

我的模型是这样的:

class Post(models.Model):
    user = models.ForeignKey(User)
    post = models.CharField(max_length=400)
    subject = models.ForeignKey(Subject, blank=True, null=True)

这是我的序列化器:

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ('user', 'post', 'subject')

    def create(self, validated_data):
        post = Post(
                user =  User.objects.get(username='A'),
                post = validated_data['post'],
        )

此时,我想检查最终用户是否提供了“主题”,如果是,则添加字段然后保存帖子对象(否则,保存帖子对象而不添加“主题”场地)。我打开了 python shell 并这样做了:

p = PostSerializer(data={'user':16, 'post':'p'})
p.is_valid()
# returned True
if p.validated_data['subject']:
    print('exists')
else:
    print('does not exist')

这会返回一个错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
KeyError: 'subject'

话虽如此,检查已验证字段是否存在的正确方法是什么?

【问题讨论】:

  • 尝试使用:p.data.get('subject', None),如果返回 None'subject' 字段不存在。
  • @Gocht 我不应该检查验证数据吗?不是未经验证的数据,因为它可能存在安全风险?
  • 当你询问is_valid()时你检查
  • @Gocht 嗯,好的,谢谢。顺便说一句,知道 .get() 方法的文档在哪里吗?因为我之前尝试过寻找它(看看它可以采用哪些其他参数)但找不到它。它在哪里提到 .get() 方法采用第二个可选参数,如果该字段不存在则返回?

标签: django django-rest-framework django-serializer


【解决方案1】:

您可以从p 访问.data attr:

p.data.get('subject', None)

如果返回None,则“主题”字段不存在。调用.is_valid() 方法时验证数据。

【讨论】:

  • 除了这个答案,你也可以做"p.validated_data.get('subject', None)"。
猜你喜欢
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多