Django-外部キープロパティでのフィルタリング


105

の特定のフィールドの値に基づいてDjangoのテーブルをフィルタリングしようとしていますForeignKey

たとえば、次の2つのモデルがあります。

class Asset(models.Model):
    name = models.TextField(max_length=150)
    project = models.ForeignKey('Project')

class Project(models.Model):
    name = models.TextField(max_length=150)

関連付けられているプロジェクトの名前に基づいてアセットリストをフィルタリングしたいのですが。

現在、2つのクエリを実行しています。

project_list = Project.objects.filter(name__contains="Foo")
asset_list = Asset.objects.filter(desc__contains=filter,
                                  project__in=project_list).order_by('desc')

メインクエリでこの種のフィルタリングを指定する方法があるかどうか疑問に思っていますか?

回答:



17

これは、queryset-refactorブランチが1.0より前に上陸してから可能になりました。 チケット4088が問題を明らかにしました。これはうまくいくはずです:

Asset.objects.filter(
    desc__contains=filter,
    project__name__contains="Foo").order_by("desc")

Djangoの多対1の文書は、このモデルとAPIを使用して外部キーを、以下の他の例があります。


1
これはDBに2回ヒットしますか?これをより最適にするためにselect_related()を使用する必要がありますか?
Fraser Graham、

5
.query.as_sql()を追加して、実際に実行されるSQLを確認できます。
高速乗算(

djangoドキュメントへのリンクは完全に古く、 '410ページが削除されました'に
到達し

0
student_user = User.objects.get(id=user_id)
available_subjects = Subject.objects.exclude(subject_grade__student__user=student_user) # My ans
enrolled_subjects = SubjectGrade.objects.filter(student__user=student_user)
context.update({'available_subjects': available_subjects, 'student_user': student_user, 
                'request':request, 'enrolled_subjects': enrolled_subjects})

上記の私のアプリケーションでは、学生が登録されると、登録されたサブジェクトと学生自身を含むサブジェクトSubjectGradeインスタンスが作成されると想定しています。

Subject and Student Userモデルは、SubjectGradeモデルの外部キーです。

「available_subjects」では、「student」属性が現在のstudent_userであるすべてのsubjectgradeインスタンスをチェックすることにより、現在のstudent_userにすでに登録されているすべての科目を除外しました

PS。私の説明でまだ理解できない場合は、事前にお詫びします。これが私が提供できる最も良い説明です。どうもありがとうございます


編集し、テキスト、説明、またはコメントをコードブロックに追加して、コンテキスト内に配置するのは素晴らしいことだと思います。
Elisha Senoo

説明します。ありがとう@ElishaSenoo
Kinowe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.