Django - Как написать кверисет, эквивалентный этому SQL-запросу? - Изменение дубликатов с помощью подсчета и FIRST_VALUE
У меня есть модель "A", которая связана с другой моделью и действует как публичное лицо для фактических данных (модель "B"), пользователи могут изменять содержимое A, но не B.
Для каждого B может существовать множество As, и они имеют отношение один ко многим.
Когда я отображаю эту модель в любое время, когда есть два или более A, связанных с B, я вижу "дублирующие" записи с (почти всегда) теми же данными, плохой опыт.
Я хочу вернуть набор элементов A, которые относятся к элементам B, и когда их больше одного, свернуть их до первого введенного элемента.
Я также хочу подсчитать связанные элементы модели B и вернуть это количество, чтобы дать мне представление о том, сколько дублирования имеется.
Я написал следующий аналогичный SQL-запрос, который подсчитывает связанные элементы и использует first_value для поиска первого A, созданного разделением по B.
SELECT *
FROM
(
SELECT
COUNT(*) OVER (PARTITION BY b_id) as count_related_items,
FIRST_VALUE(id) OVER (PARTITION BY b_id order by created_time ASC) as first_filter,
*
FROM A
) AS A1
WHERE
A1.first_filter = A1.id;
Предполагая, что мое понимание верно,
Если вы выполняете запрос из модели UserData, то запрос будет выглядеть примерно так:
Согласно CoreData.id = 18
user_data = UserData.objects.filter(code__id=18).
order_by("created_time").annotate(duplicate_count=Count('core__user')).first()
user_data будет первым созданным объектом, который связан с объектом CoreData. Также,
user_data.duplicate_count даст вам Count объектов UserData, которые связаны с объектом CoreData
Ссылка на документы по Annotate здесь