DjangoRestFramework - 序列化对象时省略空字段

时间:2015-10-07 03:51:14

标签: python django serialization django-rest-framework

这是我的模特:

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

这是我的序列化器:

class PostSerializer(serializers.ModelSerializer):

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

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

        if validated_data.get('country', None):
            post.country = validated_data['country']

        return post

有没有办法让我告诉DRF,如果该字段的值为null(因为'country'字段是可选的,有时不提供),那么跳过它并只序列化其他数据?或者至少将其序列化为None?

我认为我不能使用SerializerMethodField(http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield),因为'country'字段不是只读字段(如果提供的话,我也会写它)。

我基本上想要在序列化对象时省略该字段(或者至少使值为None)如果该字段为null。

3 个答案:

答案 0 :(得分:4)

这个帖子可能很有用:

https://stackoverflow.com/a/28870066/4698253

它基本上表示你可以稍微修改一下覆盖to_representation()函数。

我会把它放在评论中,但我还没有足够的分数:(

答案 1 :(得分:3)

从DRF 3.2.4开始,只要你添加

blank=True

到模型领域,如下:

class Post(models.Model):
    country = models.ForeignKey(Country, blank=True)

然后DRF会在序列化和反序列化时将该字段视为可选字段(注意,如果模型字段上没有null = True,那么如果您尝试将对象保存到数据库而不提供,则Django将引发错误该领域)。

有关详细信息,请参阅此处的答案:DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?

如果您使用pre-DRF 3.2.4,则可以覆盖序列化程序中的字段并为其添加required = False。有关明确指定或覆盖字段的详细信息,请参阅此处的文档:http://www.django-rest-framework.org/api-guide/serializers/#specifying-fields-explicitly

所以这样的事情(请注意,我没有完全测试下面的代码,但它应该是这些行的东西):

class PostSerializer(serializers.ModelSerializer):
    country = serializers.PrimaryKeyRelatedField(required=False)
    class Meta:
        model = Post
        fields = ('user', 'post', 'country',)

答案 2 :(得分:0)

使用allow_null=True

allow_null-如果设置为True,则该字段将接受None值或可为空的关系的空字符串。默认为False。

serializers.py

class PostSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(allow_blank=True)

    class Meta:
        model = Post