【问题标题】:Equivalent SQL Query on Django ORM join tableDjango ORM 连接表上的等效 SQL 查询
【发布时间】:2014-05-04 16:19:26
【问题描述】:

我希望它带来与 .raw 查询相同的行,但使用 ORM。我最终使用 SQL 来完成它,因为 Django 不使用 ORM 进行 JOINS,它不是 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))

【问题讨论】:

    标签: mysql sql django


    【解决方案1】:

    您可以使用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(尤其是类名的驼峰式,属性的小写_带下划线)。这将防止意外隐藏类(例如,当您使用名为 respuesta 的变量时),并且任何其他必须阅读您的代码的 Python 开发人员都会因此而爱上您。

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多