Django 1.3,Python 2.7
我有以下模型(省略了一些不相关的字段):
class Encounter(models.Model):
uuid = models.SlugField(max_length=36, unique=True, default=make_uuid, editable=False)
created = models.DateTimeField(auto_now_add=True)
subject = models.ForeignKey('Subject', to_field='uuid')
class Subject(models.Model):
given_name = models.CharField(max_length=64)
family_name = models.CharField(max_length=64)
system_id = models.CharField(max_length=32, blank=True)
uuid = models.SlugField(max_length=36, unique=True, default=make_uuid, editable=False)
def __unicode__(self):
return u'%s, %s - %s' % (self.family_name, self.given_name, self.system_id)
我想知道哪些主题出现在我的遭遇表中以及它们出现的次数。以下代码执行我想要的操作,但有一个例外:
s_in_e = Encounter.objects.values('subject').annotate(mycount=Count('subject'))
当我尝试按如下方式显示我的注释结果时:
{% for thing in s_in_e %}
<p>{{ thing.subject }} was visited {{ thing.mycount }} time{{ thing.mycount|pluralize }}.</p>
{% endfor %}
它会显示主题uuid
而不是__unicode__()
。研究表明,这是在values()
上运行的ForeignKeyField
的属性 - 它只返回id,而不是对象。有没有其他方法可以计算每个主题在遇到表中出现的次数,这样我至少可以显示__unicode__()
值?理想情况下,我可以访问整个Subject对象。
我正在研究主要是其他人的代码,所以我无法编辑模型的现有结构。如有必要,我可以在模型中添加新字段。
答案 0 :(得分:0)
您可以从Subject
开始,然后使用以下代码:
subjects = Subject.objects.prefetch_related('encounter_set')
在你的模板中:
{% for subject in subjects %}
<p> {{ subject }} was visited {{ subject.encounter_set.count }} time{{ subject.encounter_set.count|pluralize }}.</p>
{% endfor %}
prefetch_related
会在一个额外的查询中为您提供所有相关的遭遇。 subject.encounter_set
是QuerySet
,因此您可以像使用任何其他查询集一样使用count()
方法。