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

4ngedf3f  于 12个月前  发布在  Go
关注(0)|答案(3)|浏览(154)

这是我的模型:

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

字符串
这是我的serializer:

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,如果字段的值为空(因为“country”字段是可选的,有时不提供),那么跳过它,只序列化其他数据?或者至少序列化它的值为None?
我不认为我可以使用SerializerMethodField(http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield),因为“country”字段不是只读字段(如果提供了,我也会写)。
我基本上想省略字段(或至少使值无)序列化对象时,如果字段为空。

monwx1rj

monwx1rj1#

从DRF 3.2.4开始,只要添加

blank=True

字符串
到models字段,如下所示:

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


那么DRF在序列化和重新序列化它的时候会把这个字段当作可选的(注意,如果model字段上没有null=True,那么如果你试图保存一个对象到数据库而不提供这个字段,Django会抛出一个错误)。
更多信息请看这里的答案:DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?
如果您使用的是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',)

xnifntxz

xnifntxz2#

这个线程可能有用:
https://stackoverflow.com/a/28870066/4698253
它基本上说,你可以通过稍微修改来覆盖to_representation()函数。
我本来想在评论中提到这一点,但我还没有足够的分数:(

thigvfpy

thigvfpy3#

使用allow_null=True
allow_null -如果设置为True,该字段将接受值None或空字符串作为可空关系。请设置为False。

serializers.py

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

    class Meta:
        model = Post

字符串

相关问题