左连接django框架

时间:2014-05-14 21:48:37

标签: django left-join django-select-related

我有这些模特:

class PartidosFifa(models.Model):
    Partido = models.IntegerField(max_length=11, default=0)
    PaisL = models.CharField(max_length=250)
    Local = models.IntegerField(max_length=11, default=0)
    Visita = models.IntegerField(max_length=11, default=0)
    PaisV = models.CharField(max_length=250)
    Resultado = models.CharField(max_length=250, default="No jugado")
    Fecha = models.DateField()
    Estadio = models.CharField(max_length=500)
    Jugado = models.CharField(max_length=5, default="No")
    def __unicode__(self):
        return unicode(self.Partido)

class PartidosUsuarios(models.Model):
    idUsuario = models.ForeignKey(User)
    idFifa = models.ForeignKey(PartidosFifa)
    idPartido = models.CharField(max_length=20)
    UPaisL = models.CharField(max_length=250)
    ULocal = models.IntegerField(max_length=11, default=0)
    UVisita = models.IntegerField(max_length=11, default=0)
    UPaisV = models.CharField(max_length=250)
    UResultado = models.CharField(max_length=250)
    Puntos = models.IntegerField(max_length=11, default=0)
    Capturado = models.CharField(max_length=10, default="No")
    def __unicode__(self):
        return unicode(self.idPartido)

我需要让partidosFifa表显示所有记录,并显示您在表partidosUsuarios上的结果,但可能有也可能没有此表中的记录。在sql中会是这样的:

选择PartidosFifa.PaisL,PartidosFifa.PartidosFifaV,PartidosUsuarios.ULocal,PartidosUsuarios.UVista FROM PartidosFifaLEFT JOIN PartidosUsuarios ON PartidosFifa.Partido = PartidosUsuarios.idFifa

如何使用django框架编写?

1 个答案:

答案 0 :(得分:1)

使用Django ORM,你实际上并没有写出连接。您可以帮助它确定最有效的查询,在这种情况下,您希望使用prefetch_related,如下所示。

partidos_fifa_set = PartidosFifa.objects.prefetch_related('partidosusuarios_set')

这样做会为每个PartidosUsuarios记录获取所有记录PartidosFifa。要访问它,您可以按如下方式循环访问它们:

for partidos_fifa in partidos_fifa_set:
    for partidos_usuarios in partidos_fifa.partidos_usuarios_set.all():
        # Do something with partidos_usuarios
        pass

以下是docs以获得更多阅读。