[英]Equivalent SQL Query on Django ORM join table
我希望它带来与.raw查询相同的行,但使用ORM。 我最终使用SQL来完成此操作,因为Django不会通过ORM进行联接,而这并不是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))
您可以使用select_related
方法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命名约定 (特别是对于类名使用CamelCase,对于属性使用小写的with_underscores)。 这将防止意外隐藏类(例如,当您使用名为respuesta
的变量时),并且任何其他必须阅读代码的Python开发人员都会为此而爱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.