【发布时间】:2011-01-09 00:48:24
【问题描述】:
我正在尝试创建一个个人资料页面,显示分配给每个相应职业的矮人数量。我有 4 个职业,每个职业都有 2 个工作,当然还有很多矮人,每个人都有一份工作。我如何计算每个职业中的矮人数量?我的解决方案是在 HTML 中对职业名称进行硬核化,并对每个职业进行查询,但这似乎是过多的查询。
这是我“想”看到的:
Unassigned: 3
Construction: 2
Farming: 0
Gathering: 1
这是我的模型。我没有将职业直接连接到我的 Dwarves 模型(他们通过工作连接),从而增加了一些复杂性。
from django.contrib.auth.models import User
from django.db import models
class Career(models.Model):
name = models.CharField(max_length = 64)
def __unicode__(self):
return self.name
class Job(models.Model):
career = models.ForeignKey(Career)
name = models.CharField(max_length = 64)
career_increment = models.DecimalField(max_digits = 4, decimal_places = 2)
job_increment = models.DecimalField(max_digits = 4, decimal_places = 2)
def __unicode__(self):
return self.name
class Dwarf(models.Model):
job = models.ForeignKey(Job)
user = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add = True)
modified = models.DateTimeField(auto_now = True)
name = models.CharField(max_length = 64)
class Meta:
verbose_name_plural = 'dwarves'
def __unicode__(self):
return self.name
编辑 1 我的观点看起来像:
def fortress(request):
careers = Career.objects.annotate(Count('dwarf_set'))
return render_to_response('ragna_base/fortress.html', {'careers': careers})
和模板:
{% for career in careers %}
<li>{{ career.dwarf_set__count }}</li>
{% endfor %}
错误是:
Cannot resolve keyword 'dwarf_set' into field. Choices are: id, job, name
解决方案
查看:
def fortress(request):
careers = Career.objects.all().annotate(dwarfs_in_career = Count('job__dwarf'))
return render_to_response('ragna_base/fortress.html', {'careers': careers})
模板:
{% for career in careers reversed %}
<li>{{ career.name }}: {{ career.dwarves_in_career }}</li>
{% endfor %}
更好的解决方案
careers = Career.objects.filter(Q(job__dwarf__user = 1) | Q(job__dwarf__user__isnull = True)) \
.annotate(dwarves_in_career = Count('job__dwarf'))
别忘了from django.db.models import Count, Q
我喜欢上述解决方案的地方在于,它不仅返回了有矮人工作的职业,甚至还返回了没有工作的职业,这是我遇到的下一个问题。这是我对完整性的看法:
<ul>
{% for career in careers %}
<li>{{ career.name }}: {{ career.dwarves_in_career }}</li>
{% endfor %}
</ul>
【问题讨论】:
标签: sql django postgresql django-models