Django - yabancı anahtar özelliklerini filtreleme


108

Django'daki bir tabloyu a'nın belirli bir alanının değerine göre filtrelemeye çalışıyorum ForeignKey.

Örneğin, iki modelim var:

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

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

Varlık listemi ilişkili projenin adına göre filtrelemek istiyorum.

Şu anda iki sorgu yapıyorum :

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

Ana sorguda bu tür filtrelemeyi belirtmenin bir yolu olup olmadığını merak ediyorum.

Yanıtlar:


172

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


1
Teşekkürler, bunu denedim ama görünüşe göre çift alt çizgi kullanmayı unutmuşum.
Fraser Graham

3
gerekli mi?
DeadDjangoDjoker

@DeadDjangoDjoker contains, django ORM'nin ürettiği sorguda kullanılan karşılaştırma türünü açıklar, sql muhtemelen benzeyecektir LIKE '%Foo%'.
orangecaterpillar

17

Bu, queryset-refactorşube 1.0'dan önce indiğinden beri mümkün olmuştur . Ticket 4088 sorunu ortaya çıkardı . Bu çalışmalı:

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

Django Birçok bire bir dokümantasyon bu ve Modeli API kullanarak Yabancı Keys aşağıdaki diğer örnekler vardır.


1
Bu, DB'yi iki kez vuracak mı, bunu daha uygun hale getirmek için select_related () kullanmalı mıyım?
Fraser Graham

5
Gerçekte hangi sql'nin çalıştırılacağını görmek için bir .query.as_sql () ekleyebilirsiniz.
fastmultiplication

django dokümanlarının bağlantısı tamamen güncel değil ve '410 Sayfa kaldırıldı': - /
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})

Yukarıdaki başvurumda, bir öğrenci kaydolduğunda, kayıtlı konuyu ve öğrencinin kendisini içeren bir konu SubjectGrade örneğinin oluşturulacağını varsayıyorum.

Konu ve Öğrenci Kullanıcı modeli, SubjectGrade Modelinin Yabancı Anahtarıdır.

"Available_subjects" içinde, geçerli öğrenci_kullanıcısı olarak "öğrenci" özniteliğine sahip tüm konu notu örneğini kontrol ederek mevcut öğrenci_kullanıcısı tarafından zaten kayıtlı olan tüm konuları hariç tuttum

PS. Açıklamam yüzünden hala anlayamıyorsanız, şimdiden özür dilerim. Bu, sağlayabileceğim en iyi açıklama. Çok teşekkür ederim


Bence kod bloğunu bir bağlama oturtmak için düzenleyip biraz metin, açıklama veya yorum eklemenin harika olacağını düşünüyorum.
Elisha Senoo

Bir açıklama sunuyorum. Teşekkürler @ElishaSenoo
Kinowe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.