按另一个相关模型对查询集进行分组

时间:2010-11-09 05:53:31

标签: python django django-queryset

我有两种模式:

class Stop(models.Model):
    line = models.ForeignKey(TransitLine, related_name='stops')
    name = models.CharField(max_length=32)
    approved_ts = models.DateTimeField(null=True, blank=True)

class TransitLine(models.Model):
    name = models.CharField(max_length=32)
    desc = models.CharField(max_length=64)

我有一个查询集:

Stop.objects.filter(approved_ts__isnull=False)

但是,当我将此查询的结果发送到模板时,我希望它按TransitLine分组。我该如何处理?

为了澄清,最后,我希望模板看起来像这样:

<ul>
{% for tl in transit_line_list %}
 <li>
  {{ tl.name }}: 
  {% for s in tl.stops.all %}
    {{ s.name }}
  {% endfor %}
  </li>
{% endfor %}
</ul>

3 个答案:

答案 0 :(得分:1)

在模板中,您可以使用regroup ...

在使用

过滤查询集时,必须通过TransitLine进行排序
Stop.objects.filter(approved_ts__isnull=False).order_by('line')

您可以查看文档......

答案 1 :(得分:0)

如果我理解正确,您应该只为模板提供TranslitLine s的查询集。不是创建Stop的查询集,而是向approved_stops()类添加TransitLine方法,如下所示:

class TransitLine(models.Model):
    name = models.CharField(max_length=32)
    desc = models.CharField(max_length=64)

    def approved_stops(self):
        return self.stops.filter(approved_ts__isnull=False)

然后将'transit_line_list': TransitLine.objects.all()添加到模板的上下文中,并将模板中的{% for s in tl.stops.all %}更改为{% for s in tl.approved_stops.all %}

答案 2 :(得分:0)

执行以下操作:

TransitLine.objects.filter(stops__in=Stops.objects.filter(approved_ts=True)).distinct().order_by('name')

此查询仅选择已批准停靠的行。

JFYI:要查找有任何停靠点的行,请执行

TransitLine.objects.exclude(stops__id=None).order_by('name')