【问题标题】:Django ORM query with multiple inner join具有多个内连接的 Django ORM 查询
【发布时间】:2015-04-26 12:47:57
【问题描述】:

我希望能够使用 Django ORM 进行涉及多个内部联接的查询,这是我的模型(仅显示相关字段)

class PuntoMedida(models.Model):
    id_punto_medida = models.AutoField(primary_key=True,db_column='id_punto_medida')
    nombre = models.CharField(max_length=100, blank=False,db_column='nombre')
    class Meta:
        db_table = 'punto_medida'

class Instalacion(models.Model):
    id_instalacion = models.AutoField(primary_key=True,db_column='id_instalacion')
    activo = models.CharField(max_length=1, blank=False,default='1',db_column='activo')
    usuarios=models.ManyToManyField(User,through='InstalacionUsuario')
    class Meta:
        db_table = 'instalacion'

class InstanciaInstalacion(models.Model):
    id_instancia_instalacion = models.AutoField(primary_key=True,db_column='id_instancia_instalacion')
    id_instalacion = models.ForeignKey(Instalacion, blank=False, null=False,db_column='id_instalacion')
    puntos_medida=models.ManyToManyField('PuntoMedida',through='InstInstalacionPuntoMedida')
    activo = models.CharField(max_length=1, blank=True,default='1',db_column='activo')
    class Meta:
        db_table = 'instancia_instalacion'

class InstInstalacionPuntoMedida(models.Model):
    id= models.AutoField(primary_key=True,db_column='id')
    id_instancia_instalacion = models.ForeignKey(InstanciaInstalacion,db_column='id_instancia_instalacion', blank=False, null=False)
    id_punto_medida = models.ForeignKey('PuntoMedida',db_column='id_punto_medida', blank=False, null=False)
    class Meta:
        unique_together = ('id_instancia_instalacion','id_punto_medida')
        db_table = 'instancia_instalacion_punto_medida'

class InstalacionUsuario(models.Model):
    id= models.AutoField(primary_key=True,db_column='id')
    id_instalacion = models.ForeignKey(Instalacion,db_column='id_instalacion', blank=False, null=False)
    id_usuario = models.ForeignKey(User,db_column='id_usuario', blank=False, null=False)
    class Meta:
        unique_together = ('id_instalacion','id_usuario')
        db_table = 'instalacion_usuario'

我想获取与某个用户可以看到的所有对象 Instalacion 相关的所有对象 PuntoMedida。到目前为止,我已经能够使用像这样的原始 sql 来做到这一点:

SELECT a.id_punto_medida, a.nombre 
FROM punto_medida a
INNER JOIN instancia_instalacion_punto_medida b ON
a.id_punto_medida=b.id_punto_medida
INNER JOIN instancia_instalacion c ON
b.id_instancia_instalacion=c.id_instancia_instalacion
INNER JOIN instalacion d ON
c.id_instalacion=d.id_instalacion
INNER JOIN instalacion_usuario f ON
d.id_instalacion=f.id_instalacion 
AND c.activo='1'
AND d.activo='1'
and f.id_usuario=7

但是,我期待停止使用原始查询,只使用 Django ORM,以防我将来需要更改我的数据库(目前使用 PostgreSQL,可能会迁移到 Oracle)。我一直在尝试创建等效的 ORM 查询,但没有成功。任何 ORM 专家都可以帮助我使用这种语法或给我一个从哪里开始的例子?提前谢谢...

【问题讨论】:

    标签: django orm inner-join


    【解决方案1】:

    你可以试试这个:

    PuntoMedida.objects.filter(
        instanciainstalacion__activo='1',
        instanciainstalacion__id_instalacion__activo='1',
        instanciainstalacion__id_instalacion__instalacionusuario_set__id_usuario=7,
    )
    

    【讨论】:

    • 您好,刚试了一下,收到以下错误:FieldError: Cannot resolve keyword 'instanciainstalacion_set' into field。知道可能会发生什么吗?谢谢!!!!
    • 你能把错误提示的可能的字段选择粘贴给我吗?
    • 当然,这是整个错误:FieldError:无法将关键字“instanciainstalacion_set”解析为字段。选项有:activo、distribution、id_punto_medida、id_punto_medida_padre、id_tipo_medicion、identificador、incidencia、instanciainstalacion、instanciapuntomedida、instinstalacionpuntomedida、nombre、nombre_archivo、plantilladispersion、plantilladisppuntomedida、potencia_nominal、puntomedida、puntomedidadispersion
    • ok.. 让我们再试一次,尝试使用instanciainstalacion 而不是instanciainstalacion_set 我也编辑了答案。抱歉,但是当代码是西班牙语时它很难(我猜?):) 如果您再次遇到其他字段的类似错误,请尝试使用最接近的建议...
    • 现在可以使用了!!!谢谢,你的回答帮助我理解了 ORM 语法……是的,西班牙语代码:)
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多