我有以下架构:
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
个实例都没有设置 end
且Null
日期设置为ModelA.objects.exclude(
pk__in=ModelB.objects.filter(end__isnull=True).values('model_a_id')
).filter(
enabled=True, sold__isnull=True
)
的所有实例而不是“卖”。
目前我有以下查询集:
{{1}}
但它的性能非常差,有没有更好的方法来建模这个查询/ Queryset?
答案 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关系。
我认为这种逻辑涵盖了您正在寻找的案例。否则,你可以做类似的事情。