具有多个内部连接的 Django ORM 查询

Django ORM query with multiple inner join

我希望能够使用 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 专家都可以帮助我使用这种语法或给我一个从哪里开始的例子?提前致谢...

你能试试这个吗:

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