9

如何根据与之相关的模型过滤模型?下面的示例......这可行,但我认为这会两次命中数据库并且非常不雅。有没有办法直接使用查询集来做到这一点?也许不知何故select_related(),但一直无法弄清楚那个。我想返回一个QuerySetProject

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)
4

3 回答 3

14

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

#Untested Code
Project.objects.filter(action__person = person)
于 2012-12-16T18:38:41.323 回答
3

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

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()当您有很多查询遵循不同数据库表之间的关系但您不需要它来完成您想要的事情时,使用可以加快查找速度。

于 2012-12-16T18:54:05.887 回答
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
}
于 2020-12-13T00:50:42.773 回答