【发布时间】:2012-12-03 23:13:39
【问题描述】:
如何根据与之相关的模型过滤模型?下面的示例......这可行,但我认为这会两次命中数据库并且非常不雅。有没有办法直接使用查询集来做到这一点?也许以某种方式使用select_related(),但一直无法弄清楚这一点。我想返回QuerySet 中的Project。
from django.db import models
class Person(models.Model):
pass
class Project(models.Model):
pass
class Action(models.Model):
person = models.ForeignKey(Person)
project = models.ForeignKey(Project)
# Better way to do this?
def projects_by_person(person):
actions = Action.objects.filter(person=person)
project_ids = actions.values_list('project')
return Project.objects.filter(id__in=project_ids)
【问题讨论】:
-
实际上,这应该只是单个数据库命中,因为过滤器将作为子查询完成。不过,使用 Raunak 建议的双下划线语法是更好的选择。
-
很高兴知道。连接的执行速度应该比 in (...) 子查询快一点。谢谢!
标签: python django django-queryset