Django выбрать, где поле представляет собой конкатенацию строки и значения столбца - PullRequest
3 голосов
/ 01 сентября 2011

Я пытаюсь выбрать строку, где поле представляет собой конкатенацию строки и значения столбца. Это было самое близкое, что я мог получить:

qs = Report.objects.filter(job=self, persona__identity="u" + F("user__id"))

Отчет имеет поля персонажа и пользователя. Объект персонажа содержит поле идентификатора, которое является объединением идентификатора и идентификатора. Я пытаюсь получить все отчеты, в которых строка идентификатора персоны соответствует пользователю, на который ссылается отчет. (Обратите внимание, что это не мои настоящие имена таблиц ... все изменилось, чтобы защитить невинных.)

Это производит запрос как,

WHERE (`persona`.`identity` =  u + `report`.`user_id` AND ...

но мне действительно нужно что-то вроде

WHERE (`persona`.`identity` =  CONCAT("u", `report`.`user_id`) AND ...

Есть ли способ сделать это с ORM?

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Вы можете использовать extra для определения поиска в сыром SQL. Что-то вроде:

Report.objects.extra({
  where=['(`persona`.`identity` = CONCAT("u", `report`.`user_id`)']
})

Существуют некоторые недостатки использования необработанного SQL, например, код не переносим между различными механизмами БД, но для сложных запросов он гораздо более выразителен, чем попытка вставить решение в ORM.

2 голосов
/ 06 декабря 2015

Альтернатива доступна в Django 1.8:

from django.db.models import Value
from django.db.models.functions import Concat

Report.objects.filter(persona__identity=Concat(Value('u'), 'user__id'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...