【问题标题】:django how to get count for manytomany fielddjango 如何获取多对多字段的计数
【发布时间】:2015-01-24 19:55:26
【问题描述】:

我有问题的模型:

class Question(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=120)
    description = models.TextField()
    answers = models.ManyToManyField('Answer',related_name='answer_name', blank=True)
    post_date = models.DateTimeField(auto_now=True)

def __unicode__(self):
    return self.title

我有答案的模型:

class Answer(models.Model):
    user = models.ForeignKey(User)
    question = models.ForeignKey(Question)
    ans_body = models.TextField()
    post_date = models.DateTimeField(auto_now=True)

def __unicode__(self):
    return self.ans_body

问题创建和答案提交运行良好。我无法正确显示特定问题的答案。但是,当我尝试计算特定问题的答案时,它没有显示。它显示 0 个计数。

在我看来,我通过以下方式获得答案列表:

context["question_list"] = Question.objects.all()

在我的模板中

{% for question in question_list %}
   {{ question.title }}
    Ans:{{question.answers.count}}
{% endfor %}

当我这样做时,如果有答案,我会得到计数 0。如何获得特定问题的答案计数。

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    您可以执行{{ question.answers.all.count }} 之类的操作,但如果您迭代的不仅仅是问题,它将导致每个 问题的数据库查询。

    如果你想用每个问题的计数来注释整个查询集:

    from django.db.models import Count
    
    context['question_list'] = Question.objects.all().annotate(
        answer_count=Count('answers')
    )
    

    然后您可以使用{{ question.answer_count }} 访问每个问题的计数。

    【讨论】:

    • 打开了几个与 Count 注解相关的 bug。在某些情况下,'distinct' 可以解决它们。 code.djangoproject.com/ticket/15049
    • 它仍然不显示计数。如果我选择答案并从管理员保存模型,那么它会显示我选择并保存在管理员中的答案的数量。怎么了??
    【解决方案2】:

    这行得通:

    {{question.answer_set.count}}
    

    快乐..

    【讨论】:

    • 有效,但无法扩展。对于返回的每个问题,它将查询数据库一次。因此,如果您有 1000 个问题,那么您将在一个请求中仅针对这部分数据启动 1000 个查询。
    • @Ivan 那么获得计数的正确方法应该是什么?
    • @yajantb 请参阅stackoverflow.com/a/27150155/1868358 -- 我不知道 OP 遇到了什么问题,但是从父模型注释子对象的计数是要走的路。跨度>
    • @yajantb stackoverflow.com/a/27150155/1359986 -- 注释整个查询集而不是在模板中内联,这样它在第一个查询中完成而不是生成 N 个查询,其中 N 是要查询的问题数渲染
    【解决方案3】:

    为什么不使用:Question.objects.all().count()

    对于我的项目,我在“信息”模型中有一个字段

    users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="%(app_label)s_%(class)s_likes", blank=True)
    

    我使用下面的代码来计算喜欢的数量,然后将其显示在管理员列表页面中。

    # admin.py
    from django.contrib import admin
    
    from .models import Info
    class InfoAdmin(admin.ModelAdmin):
        list_display = ('id', 'title', 'like_count',)
        def like_count(self, obj):
            return obj.users_like.all().count()
    
    admin.site.register(Info, InfoAdmin)
    

    结果是: 希望这些对你有帮助!

    【讨论】:

    • 少许缺失 - like_count 函数中的 self 参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2011-02-20
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多