Django序列化器方法字段

51

我似乎无法在谷歌上找到正确的搜索结果,所以就在这里问一下:

我在序列化器中有一个字段:

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

该字段计算所有相关的“post”领域。

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

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

这是否可能?


1
第二个方法是从哪里来的?(popularity),所以你想要访问数据的地方在哪里? - Denis Cornehl
在序列化器类中,"likescount" 在 @DenisCornehl 的右侧。 - John D
1个回答

93

假设您正在使用 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')

2
嘿,我实现了相同的代码,但是出现了以下错误:AssertionError at /api/recipes/2/ Field(read_only=True) should be ReadOnlyField - Amit
如果字段不是只读的,第二个选项是有效或更好的选择,它适用于CharField或任何已知类型... - danius
1
在第二种情况下,由于变量名称和源相同(popularity),因此由于冗余性而导致AssertionError。在我的情况下,我使用了一个ReadOnlyField,因为这正是我所需要的。 - gdvalderrama
当定义 SerializerMethodField 时,obj 是什么? - user7693832
@244boy 的 obj 参数代表正在序列化的对象。这意味着,如果您正在尝试序列化 User 模型的 user 实例,则该 user 实例将作为 obj 可用。 - 00imvj00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接