【发布时间】:2014-05-07 06:47:25
【问题描述】:
我有以下架构:
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,已启用而不是“出售”。 p>
目前我有以下查询集:
ModelA.objects.exclude(
pk__in=ModelB.objects.filter(end__isnull=True).values('model_a_id')
).filter(
enabled=True, sold__isnull=True
)
但是它的性能很差,有没有更好的方法来建模这个查询/查询集?
【问题讨论】:
-
您使用的是什么类型的数据库?如果是 SQL,您是否考虑过构建原始 SQL 查询?只要表具有所述值,就可以在其中一个表上进行 LEFT JOIN 以返回行?
-
这必须与数据库无关,目前这适用于 SQLite 和 PostgreSQL,尚未测试 MySQL。而且我看到 django 将第一个查询集内联到子查询中,但仍然表现不佳。
标签: python database django django-queryset