Django count每个ForeignKeyField值在表中出现的次数&retain

2024-04-23 05:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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__()值?理想情况下,我可以访问整个主题对象。你知道吗

我的工作主要是别人的代码,所以我不能编辑模型的现有结构。如果需要的话,我可以在模型中添加一个新字段。你知道吗


Tags: namein模型selfidtrue主题uuid
1条回答
网友
1楼 · 发布于 2024-04-23 05:33:49

您可以从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()方法。你知道吗

相关问题 更多 >