Как получить последние уникальные записи из базы данных sqlite со счетчиком записей через Django ORM

#python #django #sqlite #django-orm

#python #django #sqlite #django-orm

Вопрос:

У меня есть база данных SQLite, которая выглядит следующим образом:

 |ID|DateTime|Lang|Details|
|1 |16 Oct  | GB |  GB1  |
|2 |15 Oct  | GB |  GB2  |
|3 |17 Oct  | ES |  ES1  |
|4 |13 Oct  | ES |  ES2  |
|5 |15 Oct  | ES |  ES3  |
|6 |10 Oct  | CH |  CH1  |
  

Мне нужен запрос Django, чтобы выбрать это:

 |1 |16 Oct  | GB | GB1   | 2 |
|3 |17 Oct  | ES | ES1   | 3 |
|6 |10 Oct  | CH | CH1   | 1 |
  

Итак, это уникальные (по языку) последние (по дате и времени) записи с количеством вхождений (по языку). Возможно ли это сделать с помощью одного запроса SQL или Django-ORM?

Ответ №1:

Вы можете использовать Django annotate() и value() вместе: ссылка.

когда предложение values() используется для ограничения столбцов, которые возвращаются в результирующем наборе, метод оценки аннотаций немного отличается. Вместо того, чтобы возвращать аннотированный результат для каждого результата в исходном наборе запросов, исходные результаты группируются в соответствии с уникальными комбинациями полей, указанными в предложении values(). Затем для каждой уникальной группы предоставляется аннотация; аннотация вычисляется для всех членов группы.

Ваш запрос ORM должен выглядеть следующим образом:

 queryset = Model.objects.values("Lang").annotate(
    max_datetime=Max("DateTime"),
    count=Count("ID")
).values(
    "ID", "max_datetime", "Lang", "Details", "count"
)
  

Ответ №2:

Поскольку вам нужны разные записи по «Lang» и последние записи по «DateTime», приведенный ниже запрос поможет вам,

набор запросов = Model.objects.distinct(«Lang»).order_by(«-DateTime»)