![](/img/trans.png)
[英]Ordering queryset by property of related model with another property equal to something
[英]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.