2014-05-04 17 views
0

我希望它作爲.RAW查詢確實,但使用ORM帶來的結果是相同的行。我結束了使用SQL,因爲Django不去做這樣做與ORM的連接和它不是什麼ORM代表。但我只想嘗試一下,看看是否有人能幫助我改進這些代碼。等效SQL查詢的Django的ORM連接表

感謝

query = '''SELECT 
       quiniela_encuesta.id, 
       quiniela_encuesta.golesEquipoA, 
       quiniela_encuesta.golesEquipoB, 
       quiniela_respuesta.equipoA, 
       quiniela_respuesta.equipoB 

      FROM 
       quiniela_encuesta, 
       quiniela_respuesta 

      WHERE 
       quiniela_encuesta.id = quiniela_respuesta.encuesta_id 
      AND 
       quiniela_respuesta.empleado_id = "%s" ''' % (idempleado) 

respuestas = respuesta.objects.raw(query) 

我的models.py是:

class equipo(models.Model): 

nombre = models.CharField(max_length=30) 
bandera = StdImageField(upload_to='bandera/%Y/%m/%d', 
         variations={ 
         'large':(53,53, False), 
         'thumbnail': (70, 26, False)}) 

GRUPOS = (
    ('A', 'Grupo A'), 
    ('B', 'Grupo B'), 
    ('C', 'Gropo C'), 
    ('D', 'Gropo D'), 
    ('E', 'Gropo E'), 
    ('F', 'Gropo F'), 
    ('G', 'Gropo G'), 
    ('H', 'Gropo H'), 
) 

grupo = models.CharField(max_length=1, choices=GRUPOS) 

def banderaEquipo(self): 
    return '<img src="/media/%s">' % (self.bandera.thumbnail) 

banderaEquipo.allow_tags = True 

def __unicode__(self): 
    return self.nombre 


class encuesta(models.Model): 

equipoA = models.ForeignKey(equipo, related_name='equipo_equipoA') 
golesEquipoA = models.IntegerField(max_length=2, null=True, blank=True) 
equipoB = models.ForeignKey(equipo, related_name='equipo_equipoB') 
golesEquipoB = models.IntegerField(max_length=2, null=True, blank=True) 

ETAPA = (
    ('1', 'Primera Etapa'), 
    ('2', 'Octavos De Final'), 
    ('3', 'Cuartos De Final'), 
    ('4', 'Semifinal'), 
    ('5', 'Final'), 
    ('6', '3ra Posicion') 
) 

etapa = models.CharField(max_length=1, choices=ETAPA) 
fecha = models.DateTimeField(auto_now_add=False) 

def __unicode__(self): 

    return "%s Vs. %s" % (unicode(self.equipoA), unicode(self.equipoB)) 


class respuesta(models.Model): 

encuesta = models.ForeignKey(encuesta) 
empresa = models.ForeignKey(empresa) 
empleado = models.ForeignKey(empleado) 
equipoA = models.IntegerField(max_length=1) 
equipoB = models.IntegerField(max_length=1) 
fecha = models.DateField(auto_now_add=True) 

def __unicode__(self): 

    return "%s" % (unicode(self.encuesta)) 

回答

0

可以使用select_related方法來連接表。該表將仍然是獨立的對象被加載,但下面的代碼將只執行一個查詢:

>>> respuestas = Respuesta.objects.select_related('encuesta') 
>>> for respuesta in respuestas: 
...  print respuesta.equipo_a 
...  print respuesta.encuesta.goles_equipo_a 
     # respuesta.encuesta is already loaded due to a join 
1 
23 

在一個側面說明,我建議秉承PEP-8 naming conventions(尤其是首字母大寫的類名稱,lowercase_with_underscores屬性)。這將防止不小心隱藏的類(例如,當你使用一個名爲respuesta變量),而且必須看你的代碼會愛你任何其他Python開發。