簡體   English   中英

用於向后相關字段的 Django 查詢集過濾器

[英]Django queryset filter for backwards related fields

您如何根據與其相關的模型過濾模型? 下面的示例......這有效,但我認為這兩次擊中數據庫並且非常不優雅。 有沒有辦法直接用查詢集來做? 也許以某種方式使用select_related() ,但一直無法弄清楚。 我想返回ProjectQuerySet

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)

試試這個。 我還沒有測試過,如果您有任何問題,請告訴我

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

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()可以稍微加快查找速度。

你可以在下面找到我的案例:

有老師,有課程。 教師可以有多門課程,但課程只能由一名教師完成。

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM