Django - การกรองคุณสมบัติคีย์ต่างประเทศ


108

ฉันกำลังพยายามกรองตารางใน Django ตามค่าของฟิลด์เฉพาะของไฟล์ForeignKey.

ตัวอย่างเช่นฉันมีสองรุ่น:

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

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

ฉันต้องการกรองรายการสินทรัพย์ของฉันตามชื่อของโครงการที่เกี่ยวข้อง

ขณะนี้ฉันกำลังดำเนินการสองคำค้นหา:

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

ฉันสงสัยว่ามีวิธีระบุการกรองประเภทนี้ในแบบสอบถามหลักหรือไม่?

คำตอบ:


172

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


1
ขอบคุณฉันได้ลองแล้ว แต่เห็นได้ชัดว่าลืมใช้เครื่องหมายขีดล่างคู่
Fraser Graham

3
มีความจำเป็น ??
DeadDjangoDjoker

@DeadDjangoDjoker containsอธิบายประเภทของการเปรียบเทียบที่ใช้ในแบบสอบถามที่ django ORM สร้างขึ้น sql อาจมีลักษณะLIKE '%Foo%'ดังนี้
orangecaterpillar

17

สิ่งนี้เป็นไปได้ตั้งแต่queryset-refactorสาขาลงจอดก่อน 1.0 ตั๋ว 4088เปิดเผยปัญหา สิ่งนี้ควรใช้งานได้:

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

เอกสารDjango Many-to-oneมีสิ่งนี้และตัวอย่างอื่น ๆ ของ Foreign Keys ต่อไปนี้โดยใช้ Model API


1
นี่จะตี DB สองครั้งฉันควรจะใช้ select_related () เพื่อทำให้สิ่งนี้เหมาะสมยิ่งขึ้นหรือไม่
Fraser Graham

5
คุณสามารถเพิ่ม .query.as_sql () เพื่อดูว่า sql จะถูกเรียกใช้งานจริง
fastmultiplication

ลิงก์ไปยัง django docs ล้าสมัยอย่างสมบูรณ์และเข้าสู่ '410 Page removed': - /
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})

ในใบสมัครของฉันข้างต้นฉันคิดว่าเมื่อนักเรียนลงทะเบียนแล้วอินสแตนซ์ SubjectGrade จะถูกสร้างขึ้นซึ่งมีหัวข้อที่ลงทะเบียนและตัวนักเรียนเอง

โมเดล Subject และ Student User เป็นคีย์แปลกปลอมของโมเดล SubjectGrade

ใน "available_subjects" ฉันยกเว้นวิชาทั้งหมดที่ลงทะเบียนไว้แล้วโดย student_user ปัจจุบันโดยการตรวจสอบอินสแตนซ์วิชาทั้งหมดที่มีแอตทริบิวต์ "student" เป็น student_user ปัจจุบัน

ปล. ขออภัยล่วงหน้าหากคุณยังไม่เข้าใจเนื่องจากคำอธิบายของฉัน นี่คือคำอธิบายที่ดีที่สุดที่ฉันสามารถให้ได้ ขอบคุณมาก


ฉันคิดว่ามันจะเป็นการดีที่จะแก้ไขและเพิ่มข้อความคำอธิบายหรือความคิดเห็นลงในบล็อกของโค้ดเพื่อใส่ในบริบท
Elisha Senoo

ฉันให้คำอธิบาย ขอบคุณ @ElishaSenoo
Kinowe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.