#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»)