2014-05-04 16 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开发。