Как добавить дубликат столбца в таблицу?

Я получаю данные из базы данных с помощью 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]

СПИСОК_ПОЛЕЙ[0] СПИСОК_ПОЛЕЙ[1] СПИСОК_ПОЛЕЙ[2] СПИСОК_ПОЛЕЙ[3] 1 1 3 Истинный 1 1 2 Истинный 2 1 1 ЛОЖЬ 1 1 2 Истинный 1 1 3 Истинный

Пробую спросить 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]

Так когда же это правда, если есть еще одна строка с идентичными значениями?

willeM_ Van Onsem 03.04.2024 14:56

Есть ли у модели первичный ключ (отличный от LIST_FIELDS?

willeM_ Van Onsem 03.04.2024 14:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для заданного списка столбцов вы хотите проверить наличие строки с одинаковыми значениями с помощью подзапроса 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, конечно, в любом случае не очень хорошая идея.

Другие вопросы по теме