DjangoRestFramework-如何检查valiated_data中是否存在可选的序列化器字段?

use*_*875 4 django django-serializer django-rest-framework

我的模型是这样的:

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

这是我的序列化器:

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'],
        )
Run Code Online (Sandbox Code Playgroud)

在这一点上,我想检查最终用户是否提供了“主题”,如果是,则添加字段,然后保存发布对象(否则,保存发布对象而不添加“主题”字段)。我打开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')
Run Code Online (Sandbox Code Playgroud)

这将返回一条错误消息:

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

这么说,检查经过验证的字段是否存在的正确方法是什么?

Goc*_*cht 5

您可以.data从访问attr p

p.data.get('subject', None)
Run Code Online (Sandbox Code Playgroud)

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

  • 除了这个答案,您还可以执行“p.validated_data.get('subject', None)”。 (2认同)