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 здесь

Вернуться на верх