Django序列化器方法字段

51 投票
1 回答
106522 浏览
提问于 2025-04-18 09:53

我找不到合适的谷歌搜索,所以就直接问了:

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

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

这个字段是用来计算所有相关的“帖子”。

现在我想把这个字段用在我的一个方法里:

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

这样做可以吗?

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')

撰写回答