Django - memfilter properti kunci asing

106

Saya mencoba untuk memfilter tabel di Django berdasarkan pada nilai bidang tertentu dari a ForeignKey.

Misalnya, saya punya dua model:

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

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

Saya ingin memfilter daftar aset saya berdasarkan nama proyek terkait.

Saat ini, saya melakukan dua pertanyaan:

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

Saya ingin tahu apakah ada cara untuk menentukan jenis pemfilteran ini di kueri utama?

Fraser Graham
sumber

Jawaban:

168

Asset.objects.filter( project__name__contains="Foo" )

Fragsworth
sumber
1
Terima kasih, saya sudah mencobanya tetapi ternyata saya lupa menggunakan garis bawah ganda.
Fraser Graham
3
apakah berisi perlu ??
DeadDjangoDjoker
@DeadDjangoDjoker containsmenjelaskan tipe perbandingan yang digunakan dalam query yang dihasilkan oleh django ORM, sql mungkin akan terlihat seperti itu LIKE '%Foo%'.
orangecaterpillar
17

Ini telah dimungkinkan sejak queryset-refactorcabang mendarat sebelum 1.0. Tiket 4088 mengungkap masalahnya. Ini harus bekerja:

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

The Django dokumentasi Banyak-ke-satu memiliki ini dan contoh-contoh lain dari berikut Foreign Keys menggunakan API Model.

Michael Greene
sumber
1
Apakah ini akan mengenai DB dua kali, haruskah saya menggunakan select_related () untuk membuatnya lebih optimal?
Fraser Graham
5
Anda dapat menambahkan .query.as_sql () untuk melihat sql apa yang sebenarnya akan dieksekusi.
fastmultiplication
tautan ke dokumen django benar-benar kedaluwarsa dan berada di 'Halaman 410 dihapus': - /
szeitlin
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})

Dalam aplikasi saya di atas, saya berasumsi bahwa setelah seorang siswa terdaftar, instance subjek SubjectGrade akan dibuat yang berisi subjek yang terdaftar dan siswa itu sendiri.

Model Subjek dan Pengguna Mahasiswa adalah Kunci Asing untuk Model SubjectGrade.

Di "available_subjects", saya mengecualikan semua mata pelajaran yang sudah didaftarkan oleh student_user saat ini dengan memeriksa semua instance subjectgrade yang memiliki atribut "student" sebagai student_user saat ini

PS. Mohon maaf sebelumnya jika Anda masih tidak bisa mengerti karena penjelasan saya. Ini adalah penjelasan terbaik yang bisa saya berikan. Terima kasih banyak

Kinowe
sumber
Saya pikir akan sangat bagus untuk mengedit dan menambahkan beberapa teks, penjelasan atau komentar ke blok kode untuk meletakkannya dalam konteks.
Elisha Senoo
Saya memberikan penjelasan. Terima kasih @ElishaSenoo
Kinowe