9

モデルに関連するモデルに基づいて、モデルをどのようにフィルタリングできますか?以下の例...これは機能しますが、これはDBに2回ヒットし、かなりエレガントではないと思います。クエリセットを使用して直接実行する方法はありますか?どういうわけかで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)
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 ...

次に、たとえば次のクエリを発行して、ジョンと呼ばれる人々からすべてのプロジェクトを取得できます。

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

の使用法はselect_related()、異なるデータベーステーブル間の関係に従うクエリがたくさんあるが、必要なことを達成するためにそれを必要としない場合に、ルックアップを少しスピードアップすることができます。

于 2012-12-16T18:54:05.887 に答える
0

あなたは私のケースを以下で見つけることができます:

教師とコースがあります。教師は複数のコースを持つことができますが、コースは1人の教師によってのみ行われます。

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 に答える