Я получаю данные из базы данных с помощью Django ORM:
ws = Ws.objects.all()
ws = ws.filter(*q_objects, **filter_kwargs)
ws = ws.order_by(*sort_list)
ws = ws.annotate(created_unix=UnixTimestamp(F('created')), date_unix=UnixTimestamp(F('date')))))
total_sum = ws.aggregate(total=Sum('ts_time', output_field=DecimalField()))['total'])['total']
LIST_FIELDS[1], LIST_FIELDS[2] = 'created_unix', 'date_unix'
return JsonResponse({'table_data': list(ws.values_list(*LIST_FIELDS)), 'summ_time': total_sum}, safe=False) ```
Мне нужно добавить новый столбец в LIST_FIELDS, который имеет значение True для каждой пары строк, в которых несколько полей совпадают или имеют значение False.
Например: Для LIST_FIELDS[0] и LIST_FIELDS[2]
Пробую спросить GPT4, но Т9 мне упорно выдает
ws = ws.annotate(
match=Case(
When(field1=F('field2'), then=Value(True)),
default=Value(False),
output_field=BooleanField()
)
)
Но это как сравнивать field1 == field2 В ОДНОЙ строке
И мне нужно Правда, если row1[field1] == row2[field1] and row1[field2] == row2[field2]
Есть ли у модели первичный ключ (отличный от LIST_FIELDS?






Для заданного списка столбцов вы хотите проверить наличие строки с одинаковыми значениями с помощью подзапроса Exists [Django-doc]:
from django.db.models import Exists, OuterRef, Q
UNIQUE_FIELDS = ['created_unix', 'date_unix']
ws = Ws.objects.filter(*q_objects, **filter_kwargs)
ws = Ws.annotate(
has_duplicate=Exists(
ws.filter(
~Q(pk=OuterRef('pk')), Q(**{k: OuterRef(k) for k in UNIQUE_FIELDS})
)
)
)Таким образом, мы ищем существование объекта Ws из ws (отфильтрованного таким образом), который имеет другой первичный ключ (~Q(pk=OuterRef('pk'))) и одинаков для элементов в UNIQUE_FIELDS. Таким образом, поле has_duplicate является True, если в этом случае существует другая строка с теми же значениями для created_unix и date_unix.
Ответ, кстати, представляет собой безопасный JSON, поэтому вы можете удалить параметр safe=False,. Отправка небезопасного JSON, конечно, в любом случае не очень хорошая идея.
Так когда же это правда, если есть еще одна строка с идентичными значениями?