django如何计算许多人的领域

gam*_*mer 5 python django django-queryset

我有问题的模型:

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
Run Code Online (Sandbox Code Playgroud)

我有回答的模型:

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
Run Code Online (Sandbox Code Playgroud)

问题创建和答案提交工作完美.我无法正确显示特定问题的答案.但是,当我试图得到特定问题的答案时,它没有显示出来.它显示0计数.

在我看来,我得到的答案列表:

context["question_list"] = Question.objects.all()
Run Code Online (Sandbox Code Playgroud)

在我的模板中

{% for question in question_list %}
   {{ question.title }}
    Ans:{{question.answers.count}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

gam*_*mer 9

这有效:

{{question.answer_set.count}}
Run Code Online (Sandbox Code Playgroud)

快乐..

  • 这有效,但不会扩展.它将为返回的每个问题查询一次数据库.因此,如果您有1000个问题,则仅在单个数据位的单个请求中启动1000个查询. (4认同)

Ber*_*ant 7

你可以做类似的事情{{ question.answers.all.count }},但是如果你不仅仅是问题,那么它将导致每个问题的数据库查询.

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

from django.db.models import Count

context['question_list'] = Question.objects.all().annotate(
    answer_count=Count('answers')
)
Run Code Online (Sandbox Code Playgroud)

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


C.K*_*.K. 6

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

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

users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="%(app_label)s_%(class)s_likes", blank=True)
Run Code Online (Sandbox Code Playgroud)

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

# 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)
Run Code Online (Sandbox Code Playgroud)

结果是: 图像 希望这些可以帮助到你!