Django ORM получает последний предмет для каждой группы - PullRequest
0 голосов
/ 25 мая 2019

Я использую Django 2.2.1 с MariaDB 10.3.15.

У меня есть следующие модели:

class Hose(models.Model):
    description = models.CharField(blank=True, max_length=250)
    number = models.IntegerField(unique=True)

class HoseHistory(models.Model):
    class Meta:
        unique_together = (("date", "hose", "hose_event"),)

    date = models.DateTimeField()
    description = models.CharField(blank=True, max_length=250)
    hose = models.ForeignKey(Hose, on_delete=models.CASCADE)
    hose_event = models.ForeignKey(HoseEvent, on_delete=models.CASCADE)

Теперь я хочу получить список всех записей таблицы шланговс, если он есть, последней строкой HoseHistory.

Результирующий набор должен выглядеть так:

| Hose.description | Hose.number | HoseHistory.date | HoseHistory.description |
===============================================================================
|    Example A     |      1      |    2019-01-09    |         Event A         |
|    Example B     |      2      |       NULL       |          NULL           |

Таким образом, Django должен создать SQL-запрос, который выбирает Tabele Hose, LEFTПрисоединяется к таблице HoseHistory, затем группируется по Hose.number, а затем все MAX по HoseHistory.date.

Я пробовал, например:

Hose.objects.values("number").annotate(max_date=Max("hosehistory__date")).order_by("hosehistory__date")

Но проблема в том, что с этой стратегией я толькоесть столбцы max_date и number, если я добавлю больше столбцов, они будут добавлены в оператор GROUP BY, и этот запрос не будет работать.

1 Ответ

0 голосов
/ 25 мая 2019

Вы можете добавить метод в модель

def latest_history(self):
    return HoseHistory.objects.filter(hose=self).order_by('-date').first()

и вызвать в своем шаблоне: {{ hose.latest_history }}, если существует последняя история

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...