2015-02-24 36 views
1

我希望能夠做涉及到多個內部連接使用Django ORM,這裏是我的模型(只顯示相關字段)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

你可以試試這個:

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

HI,剛剛試了一下,收到出現以下錯誤: FieldError:無法將關鍵字'instanciainstalacion_set'解析到字段中。任何想法可能會發生什麼?謝謝!!!! – user3851205 2015-02-24 20:23:59

+0

您能否將我錯誤提示的可能字段選項粘貼到我的列表中? – Todor 2015-02-24 20:35:05

+0

當然,這裏是整個錯誤:FieldError:無法將關鍵字'instanciainstalacion_set'解析到字段中。選項包括:ACTIVO,分散,id_punto_medida,id_punto_medida_padre,id_tipo_medicion,identificador,incidencia,instanciainstalacion,instanciapuntomedida,instinstalacionpuntomedida,農佈雷,nombre_archivo,plantilladispersion,plantilladisppuntomedida,potencia_nominal,puntomedida,puntomedidadispersion – user3851205 2015-02-24 20:39:04