Джанго - как я могу сделать этот запрос в ORM - PullRequest
0 голосов
/ 26 июня 2018

Привет всем, я пытаюсь сделать этот запрос:

SELECT * 
FROM dashboard_informe inf
INNER JOIN dashboard_servicio serv ON inf.servicio_id = serv.id
WHERE serv.nombre LIKE 'Inventario' AND inf.nombre LIKE 'Inventario%'

и я не знаю, как это сделать, я попробовал это:

b = Servicio.objects.all().values_list('id')
r = Informe.objects.filter(servicio_id=b)

И это дает мне ошибку: «Значение QuerySet для точного поиска должно быть ограничено» ValueError: Значение QuerySet для точного поиска должно быть ограничено одним результатом с использованием срезов.

Есть что-нибудь для этого? или, может быть, лучше создать процедуру хранения с этим запросом?

Вперед, спасибо!

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Лучше использовать values_list()

b = Servicio.objects.all().values_list('id', flat=True) r = Informe.objects.filter(servicio_id__in=b)

0 голосов
/ 26 июня 2018
SELECT * 
FROM dashboard_informe inf
INNER JOIN dashboard_servicio serv ON inf.servicio_id = serv.id
WHERE serv.nombre LIKE 'Inventario' AND inf.nombre LIKE 'Inventario%'

r = Informe.objects.filter(servicio__nombre='Inventario', nombre__startswith='Inventario')
0 голосов
/ 26 июня 2018

Я думаю, вы ищете поиск поля __in :

b = Servicio.objects.filter(nombre__startswith='Inventario').values('id')
r = Informe.objects.filter(servicio_id__in=b)

Django преобразует первый запрос в подзапрос, в результате чего SQL будет выглядеть примерно так:

SELECT ... 
FROM dashboard_informe inf 
WHERE inf.id IN (
    SELECT s.id 
    FROM dashboard_servicio s 
    WHERE s.nombre LIKE 'Inventario%'
);
...