Группировка набора запросов по другой связанной модели - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть две модели:

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 ]

1 голос
/ 09 ноября 2010

В шаблоне вы можете использовать Перегруппировать ...

Вы должны упорядочить их по TransitLine, пока вы фильтруете набор запросов, используя

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

Вы можете проверить документацию ...

0 голосов
/ 09 ноября 2010

Выполните следующие действия:

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')
0 голосов
/ 09 ноября 2010

Если я правильно понимаю, вы должны просто дать шаблону набор запросов TranslitLine с. Вместо того чтобы создавать набор запросов из 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 %}.

...