用于向后相关字段的Django查询集过滤器

时间:2012-12-16 18:36:16

标签: python django django-queryset

如何根据与之相关的模型过滤模型?下面的例子......这是有效的,但我认为这次击中了DB两次并且非常不优雅。有没有办法直接使用查询集?也许以某种方式与select_related(),但无法弄清楚那一个。我想返回QuerySet的{​​{1}}。

Project

3 个答案:

答案 0 :(得分:10)

试试这个。我没有测试过,如果您有任何问题请告诉我

#Untested Code
Project.objects.filter(action__person = person)

答案 1 :(得分:2)

PersonProject之间是否存在多对多关系,这是真的吗?如果是这样,您可以像这样简化设置:

class Person(models.Model):
    projects = models.ManyToManyField('Project')
    name = models.CharField(max_length=100)     # just an example

class Project(models.Model):
    # ... some fields here ...

然后你可以发出以下查询以获取名为John的人的所有项目:

Project.objects.filter(person_set__name="John")

当你有很多查询跟随不同数据库表之间的关系但是你不需要它来完成你想要的任何事情时,使用select_related()可以加快查询速度。

答案 2 :(得分:0)

您可以在下面找到我的情况:

有老师和课程。老师可以开设多门课程,但是课程只能由一位老师完成。

class Course(models.Model):
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    -------

class Teacher(models.Model):
    name = models.CharField(max_length=50)
    ------

在“个人老师”页面中,我想列出该个人老师提供的所有课程。您可以在下面找到相关的查看功能。

def teacher(request, teacher_id):
teacher = get_object_or_404(Teacher, pk=teacher_id)
courses = Course.objects.filter(teacher = teacher)

context = {
    'teacher': teacher,
    'courses': courses
}