gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:42:36 26 4
gpt4 key购买 nike

这是我的模型:

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 如果该字段的值为空(因为“国家/地区”字段是可选的,有时不提供)然后跳过它并只序列化其他数据?或者至少用 None 值序列化它?

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

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

最佳答案

从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?

如果您使用的是 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',)

关于python - DjangoRestFramework - 序列化对象时省略空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32983504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com