django аннотировать набор запросов с результатом сравнения полей - PullRequest
1 голос
/ 29 февраля 2020

У меня есть такой набор запросов:

predicts = Prediction.objects.select_related('match').filter(match_id=pk)

Мне нужно аннотировать это новым полем is_correct. Мне нужно сравнить два строковых поля, и результат должен быть аннотирован в этом новом поле. я хочу сравнить следующие поля:

  • predict из таблицы прогнозов
  • result из таблицы совпадений (которая была объединена через select_related)

Мне нужно знать, какое выражение я должен поместить в мою функцию аннотации; ниже у меня есть мой текущий код, который проходит исключение TypeError:

predicts = predicts.annotate(is_correct=(F('predict') == F('result')))

, вся помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ:

Я нашел альтернативное решение, которое выполняет эту работу за меня (фильтрация прогноза по результату совпадения с использованием filter и exclude), но я все еще хотел бы знать, как решить этот конкретный c случай, когда новое аннотированное поле результат сравнения двух других полей набора запросов. Для тех, кому это может понадобиться, в Django 2.2 и более поздних версиях функция базы данных Nullif выполняет сравнение между двумя полями.

1 Ответ

0 голосов
/ 01 марта 2020

Вы можете использовать функцию extra , ловушку для вставки определенных выражений c в SQL.

Прежде всего, мы должны знать названия приложений и модели или названия таблиц в базе данных.

Предполагая, что в вашем случае две таблицы называются "app_prediction" и "app_match".

Предложение будет следующим :

Prediction.objects.select_related('match').extra(
    select={'is_correct': "app_prediction.predict = app_match.result"}
)

Это добавит поле с именем is_correct в ваш результат, в базе данных поля и таблицы должны вызываться одинаково.

Было бы лучше см. модели.

...