Django LEFT JOIN?

9 python django

我有模特,或多或少像这样:

class ModelA(models.Model):
    field = models.CharField(..)

class ModelB(models.Model):
    name = models.CharField(.., unique=True)
    modela = models.ForeignKey(ModelA, blank=True, related_name='modelbs')

    class Meta:
        unique_together = ('name','modela')
Run Code Online (Sandbox Code Playgroud)

我想做一个查询,其中包括:"获取所有ModelA的字段名称等于X,其中ModelB模型的名称为X OR,根本没有模型名称"

到目前为止我有这个:

ModelA.objects.exclude(field=condition).filter(modelsbs__name=condition)
Run Code Online (Sandbox Code Playgroud)

这将使我获得至少有一个modelB的所有ModelAs(实际上它总是只有一个) - 但如果ModelA没有相关的ModelB,它将不在结果集中.我需要它在结果集中使用obj.modelb = None之类的东西

我怎么能做到这一点?

Gle*_*ard 11

使用Q结合两个条件:

from django.db.models import Q
qs = ModelA.objects.exclude(field=condition)
qs = qs.filter(Q(modelbs__name=condition) | Q(modelbs__isnull=True))
Run Code Online (Sandbox Code Playgroud)

要检查生成的SQL查询:

print qs.query.as_sql()
Run Code Online (Sandbox Code Playgroud)

在类似的查询中,这将生成LEFT OUTER JOIN ... WHERE(a.val = b OR a.id IS NULL).

  • 如果您要说的是"它不起作用",我当然无法帮助您.你有没有检查过SQL? (3认同)