Django - lọc các thuộc tính khóa ngoại


105

Tôi đang cố gắng lọc một bảng trong Django dựa trên giá trị của một trường cụ thể của ForeignKey .

Ví dụ, tôi có hai mô hình:

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

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

Tôi muốn lọc danh sách tài sản của mình dựa trên tên của dự án được liên kết.

Hiện tại, tôi đang thực hiện hai truy vấn:

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

Tôi tự hỏi liệu có cách nào để chỉ định loại lọc này trong truy vấn chính không?

Câu trả lời:


167

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


1
Cảm ơn, tôi đã thử điều đó nhưng dường như tôi đã quên sử dụng dấu gạch dưới kép.
Fraser Graham

3
có cần thiết không ??
DeadDjangoDjoker

@DeadDjangoDjoker containsmô tả kiểu so sánh được sử dụng trong truy vấn mà django ORM tạo ra, sql có thể sẽ trông như thế nào LIKE '%Foo%'.
orangecaterpillar

17

Điều này đã có thể thực hiện được kể từ khi queryset-refactorchi nhánh hạ cánh trước phiên bản 1.0. Vé 4088 phơi bày sự cố. Điều này sẽ hoạt động:

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

Tài liệu Nhiều-một của Django có điều này và các ví dụ khác về việc theo dõi Khóa ngoại bằng API Mô hình.


1
Điều này sẽ xảy ra với DB hai lần, tôi có nên sử dụng select_inity () để làm cho điều này tối ưu hơn không?
Fraser Graham

5
Bạn có thể thêm .query.as_sql () để xem sql thực sự sẽ được thực thi.
fastmultiplication

các liên kết đến các tài liệu django là hoàn toàn lỗi thời và những vùng đất trên '410 trang loại bỏ': - /
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})

Trong đơn đăng ký của tôi ở trên, tôi giả định rằng khi một sinh viên đã đăng ký, một đối tượng SubjectGrade sẽ được tạo ra có chứa chủ thể đã đăng ký và bản thân sinh viên đó.

Mô hình Người dùng Đối tượng và Sinh viên là Khóa ngoại cho Mô hình Môn học.

Trong "ready_subjects", tôi đã loại trừ tất cả các môn học đã được đăng ký bởi student_user hiện tại bằng cách kiểm tra tất cả phiên bản môn học có thuộc tính "student" là student_user hiện tại

Tái bút. Trước lời xin lỗi nếu bạn vẫn không thể hiểu được vì lời giải thích của tôi. Đây là lời giải thích tốt nhất mà tôi có thể cung cấp. Cảm ơn bạn rất nhiều


Tôi nghĩ sẽ rất tuyệt nếu chỉnh sửa và thêm một số văn bản, giải thích hoặc nhận xét vào khối mã để đặt nó vào ngữ cảnh.
Elisha Senoo

Tôi cung cấp một lời giải thích. Cảm ơn @ElishaSenoo
Kinowe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.