【问题标题】:How to use count() in serializers?如何在序列化程序中使用 count()?
【发布时间】:2022-01-15 02:35:55
【问题描述】:

我正在尝试计算文章喜欢的次数,但问题是我面临各种错误。这是我的代码:

class ArticleLikeSerializer(serializers.ModelSerializer):

    class Meta:
        model = ArticleLike
        fields = ('id',"author","article",'timestamp')

class ArticleSerializer(serializers.ModelSerializer):
    articlelikes_set = ArticleLikeSerializer(source='articlelikes',required=False,many=True)
    total_likes = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Article
        fields = ('id','author','caption','total_likes','articlelikes_set')

    def get_total_likes(self, language):
        return articlelikes_set.count()

这是我的错误:

name 'articlelikes_set' is not defined

我该如何解决这个问题?

【问题讨论】:

  • return language.articlelikes.count()
  • 解决了这个问题。非常感谢。如果你愿意,把它写成答案,这样我就可以在上面打上绿色的勾了!

标签: django django-rest-framework


【解决方案1】:

language 是您正在序列化的对象,因此您返回:

class ArticleSerializer(serializers.ModelSerializer):
    # …

    def get_total_likes(self, language):
        return language.articlelikes.count()

【讨论】:

  • 我怀疑这会做 N+1 个查询。最好用我认为的计数来注释视图上的查询集 - 也许 django 在这里很聪明?
  • @michjnich:是的,应该在视图集中完成,然后字段是IntegerField,而不是SerializerMethodField
  • 不,我测试了它,它工作正常。它没有在任何地方显示 N+1 查询。当结果为 0 时,它显示为 0。
  • @umarbeyoglu:如果您序列化 多个 Articles,它将显示 N+1 查询,例如文章的 APIListView
猜你喜欢
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2015-03-29
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多