【问题标题】:My serializer that returns a 0 for Null value is not working我的为 Null 值返回 0 的序列化程序不起作用
【发布时间】:2021-01-20 18:06:13
【问题描述】:

我正在尝试创建一个在请求 API 数据时返回值 0 而不是 Null 的序列化程序。

class MyIntegerField(serializers.IntegerField):
    def to_representation(self, value):
        if value is None:
            return 0
        return super(MyIntegerField, self).to_representation(value)

class ListSerializer(serializers.ModelSerializer):
    post_count = MyIntegerField(initial=0)
    class Meta:
        model = Post
        fields = (...,
                 'post_count',
                  ...)

模型.py:

post_count = models.IntegerField(blank=True, null=True)

如果用户没有帖子,那么我想返回值 0,而不是 Null。

我当前的序列化程序有什么问题?我认为输入的字段仍然是从我的模型字段中提取的,而不是新的序列化程序函数。

目前,当用户请求数据时,我仍然收到 Null。

【问题讨论】:

  • 我认为您正在寻找 .to_internal_value(self, data) 方法而不是 to_representation(self, value) 方法。
  • Willem,刚刚尝试了您对函数的方法推荐并返回。没有收到任何错误,但在返回数据中仍然收到 Null

标签: python django django-rest-framework


【解决方案1】:

改用SerializerMethodField

class ListSerializer(serializers.ModelSerializer):
    post_count = serializers.SerializerMethodField()
    class Meta:
        model = Post
        fields = (...,
                 'post_count',
                  ...)
    def get_post_count(self, obj):
        if obj.post_count:
            return obj.post_count
        return 0

【讨论】:

  • 我不知道 SerializerMethodField() 存在 :) ,从现在开始,你让我的生活变得轻松了很多。
  • @Dre 不要忘记这是一个只读字段,避免在序列化程序中使用太多。因为它会降低性能一点^^
  • 想知道为什么它会降低性能?
  • 对于您的情况,我们应该使用它。 SerializerMethodField的执行时间与get_post_count方法中代码块的执行时间有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多