【问题标题】:Django Serializer Method FieldDjango 序列化程序方法字段
【发布时间】:2014-08-05 16:55:47
【问题描述】:

似乎找不到合适的谷歌搜索,所以这里是:

我的序列化程序中有一个字段:

likescount = serializers.IntegerField(source='post.count', read_only=True)

计算所有相关字段“post”。

现在我想将该字段用作我的方法的一部分:

def popularity(self, obj):
        like = self.likescount
            time = datetime.datetime.now()
            return like/time

这可能吗?

【问题讨论】:

  • 第二种方法从何而来? (popularity),那么你想在哪里访问数据?
  • 就在序列化程序类中,其中“likescount”在@DenisCornehl中

标签: python django django-rest-framework


【解决方案1】:

假设post.count 被用于衡量帖子的点赞数,而您实际上并不打算在流行度方法中将整数除以时间戳,那么试试这个:

使用SerializerMethodField

likescount = serializers.SerializerMethodField('get_popularity')

def popularity(self, obj):
    likes = obj.post.count
    time = #hours since created
    return likes / time if time > 0 else likes

不过我建议将其作为模型中的属性

在您的模型中:

@property
def popularity(self):
    likes = self.post.count
    time = #hours since created
    return likes / time if time > 0 else likes

然后使用通用Field 在您的序列化程序中引用它:

class ListingSerializer(serializers.ModelSerializer):
    ...
    popularity = serializers.Field(source='popularity')

【讨论】:

  • 嘿,我实现了相同但得到以下错误:AssertionError at /api/recipes/2/Field(read_only=True) should be ReadOnlyField
  • 如果字段不是只读的,第二个选项是有效或更好的选项,它适用于 CharField 或任何已知的类型...
  • 在第二种情况下,由于变量名和来源相同(流行度),由于冗余,您会得到一个AssertionError。就我而言,我使用了 ReadOnlyField,因为它是我需要的。
  • 当定义一个 SerializerMethodField 时,obj 是什么?
  • @244boy obj 参数表示正在序列化的对象。这意味着,如果您尝试序列化 User 模型的 user 实例,则 user 实例将作为 obj 使用。
猜你喜欢
  • 2017-03-26
  • 2018-10-18
  • 2021-11-08
  • 1970-01-01
  • 2021-11-30
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多