Django计算每个ForeignKeyField值出现在表&中的次数。保留__unicode __()

时间:2014-04-06 13:48:12

标签: python django django-1.3

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对象。

我正在研究主要是其他人的代码,所以我无法编辑模型的现有结构。如有必要,我可以在模型中添加新字段。

1 个答案:

答案 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_setQuerySet,因此您可以像使用任何其他查询集一样使用count()方法。