/ / Джанго ORM заявка с множество вътрешни съединения - django, orm, internal-join

Django ORM заявка с множество вътрешни връзки - django, orm, 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"

Искам да получа всички обекти PuntoMedida, свързани с всички обекти Instalacion, които определен потребител може да види. Досега успях да направя това с помощта на необработен 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 експерт там, отколкото може да ми помогне с този синтаксис или да ми даде пример за това къде да започна? Благодаря предварително ...

Отговори:

1 за отговор № 1

Можете ли да опитате това:

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