Django-如何在ORM中执行此查询

时间:2018-06-26 14:21:12

标签: python django django-orm

大家好,我正在尝试执行以下查询:

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 :(得分:3)

我认为您正在寻找__in field lookup

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%'
);

答案 1 :(得分:0)

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')

答案 2 :(得分:-1)

更好地使用values_list()

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