如果相关表中没有值,如何选择行?

时间:2014-03-28 00:43:46

标签: python database django django-queryset

我有以下架构:

class ModelA(models.Model)
    sold = models.DateFiled(blank=True, null=True)
    enabled = models.BooleanField()

class ModelB(models.Model):
    model_a = models.ForeignKey(ModelA)
    start = models.DateField()
    end = models.DateField(blank=True, null=True, db_index=True)

我想让ModelA的所有ModelB个实例都没有设置 endNull日期设置为ModelA.objects.exclude( pk__in=ModelB.objects.filter(end__isnull=True).values('model_a_id') ).filter( enabled=True, sold__isnull=True ) 的所有实例而不是“卖”。

目前我有以下查询集:

{{1}}

但它的性能非常差,有没有更好的方法来建模这个查询/ Queryset?

1 个答案:

答案 0 :(得分:0)

您实际上可以从ModelA过滤ModelB关系,并让Django执行左外连接。以下查询应该进行连接而不是使用子查询:

from django.db.models import Q
q = ModelA.objects.exclude(Q(model_b__isnull=False) & Q(model_b__end__isnull=True))

在django shell中尝试上述操作,并执行print q.query以查看它如何转换为SQL。 Q()语法允许您执行" OR"过滤。我们基本上说:给我所有的ModelA,不要:与end__isnull = True建立一个modelB关系。

我认为这种逻辑涵盖了您正在寻找的案例。否则,你可以做类似的事情。