Django模板渲染关系模式对象名称没有重复

时间:2013-08-01 20:28:49

标签: django django-templates foreign-keys django-queryset

所以我一直在试图弄清楚如何在模板中渲染相关对象。我一直在尝试使用模板中的查询集来完成它,但我可能完全错了,我需要对上下文做一些事情。无论哪种方式,我都不知道我应该做什么。

我想做什么:

获取一个包含将要发布的提示的查询集。

在查询集的帮助下,呈现城市的提示列表。列表本身是站点和所述站点的提示数量以及特定区域的提示总数。

我想在模板中呈现的内容

Uptown (3)
   K-Jah (2)
   Chatterbox FM (1)

Staunton Island (1)
   Lips 106 (1)

我一直在努力:

<table>
    {% for object in object_list %}
    <tr>
        <th>Region</th>
    </tr>
    <tr>
        <td>{{ object.station.region }} </td>
    <tr>
        <th>Station</th>
        <td>{{ object.station.name }}</td>

    {% endfor %}
</table>

现在这显然是错误的,我知道。它循环并多次呈现相同的区域和站名称,并且我不呈现区域或站点在循环中出现的次数。

我的模型设置如下:

models.py

class Tip(models.Model):

    name = models.TextField(verbose_name=_('name'), blank=True, null=True)
    email = models.EmailField(verbose_name=_('email'), max_length=50, blank=True, null=True)
    description = models.TextField(verbose_name=_('description'), blank=True, null=True)
    comment = models.TextField(max_length=255, blank=True, null=True)
    published = models.BooleanField(default=False, verbose_name=_('published'))

class NamedModel(models.Model):
    name = models.CharField(verbose_name=_('name'), max_length=255)

    def __unicode__(self):
            return u'%s' % self.name

class Region(NamedModel):

    def __unicode__(self):
       return u'%s' % self.name

class Station(models.Model):

    name = models.CharField(verbose_name=_('name'), max_length=255)
    phone = models.CharField(verbose_name=_('phone'), max_length=255, blank=True)
    region = models.ForeignKey(Region, verbose_name=_('region'))

    def __unicode__(self):
        return u'%s' % self.name


class StationTip(Tip):
    station = models.ForeignKey(Station, verbose_name=_('station'))

    def __unicode__(self):
        return u'%s' % self.school

查询集:

K-Jah region = Uptown

Chatterbox region = Uptown

Lips 106 region = Staunton Island

StationTip.objects.all().filter(published=True)

查询集返回的内容:

[<StationTip: K-Jah>, <StationTip: K-Jah>, <StationTip: Lips 106>, <StationTip: Chatterbox FM>]

1 个答案:

答案 0 :(得分:1)

您要使用的是annotate函数与values函数的组合:

from django.db.models import Count
tips = StationTip.objects.filter(published=True).values('station__name', 'station__region').annotate(count=Count('id'))

这将创建一个列表,其中包含station.namestation.region的每个唯一组合的字典,以及额外的键count和出现次数。

在您的模板中(如果您将提示作为object_list传递):

<table>
    {% for object in object_list %}
    <tr>
        <th>Region</th>
        <th>Station</th>
        <th>Count</th>
    </tr>
    <tr>
        <td>{{ object.station__region}} </td>
        <td>{{ object.station__name }}</td>
        <td>{{ object.count }}</td>
    </tr>

    {% endfor %}
</table>