簡體   English   中英

通過另一個相關模型對查詢集進行分組

[英]Grouping a queryset by another related model

我有兩個模型:

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>

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

您必須使用TransitLine對其進行排序,同時使用過濾查詢集

Stop.objects.filter(approved_ts__isnull=False).order_by('line')

您可以查看文檔...

如果我理解正確,那么您實際上應該只為模板提供一個TranslitLine的查詢集。 與其創建一個Stop的查詢集,不如向您的TransitLine類添加一個approved_stops()TransitLine approved_stops()方法,如下所示:

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.stops.all %}更改為{% for s in tl.stops.all %}中的{% for s in tl.approved_stops.all %}

請執行下列操作:

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM