2009-02-10 28 views
5

tôi có các mô hình sau:Làm cách nào để sử dụng ORM Django để truy vấn ví dụ nhiều-nhiều này?

class Author(models.Model): 
    author_name = models.CharField() 

class Book(models.Model): 
    book_name = models.CharField() 

class AuthorBook(models.Model): 
    author_id = models.ForeignKeyField(Author) 
    book_id = models.ForeignKeyField(Book) 

Với điều đó đang được nói, tôi đang cố gắng để bắt chước truy vấn này bằng cách sử dụng Django ORM (chọn tất cả các cuốn sách được viết bởi một tác giả cụ thể, lưu ý rằng tác giả có thể có nhiều sách và sách có thể có nhiều tác giả):

SELECT book_name 
FROM authorbook, book 
WHERE authorbook.author_id = 1 
AND authorbook.book_id = book.id 

tôi đã đọc this FAQ page trên trang web Django, nhưng trước khi tôi thay đổi cấu trúc mô hình của tôi và loại bỏ AuthorBook, tôi đã tò mò nếu tôi có thể bắt chước truy vấn mà sử dụng cấu trúc hiện tại .

Trả lời

14

Bạn sẽ có thể làm:

books = Book.objects.filter(authorbook__author_id=1) 

để có được một QuerySet của Sách đối tượng phù hợp với hạn chế AUTHOR_ID của bạn.

Điều tuyệt vời về Django là bạn có thể nấu món này và chơi xung quanh với nó trong vỏ. Bạn cũng có thể tìm thấy http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships để hữu ích.

+0

Argh. Cảm ơn - não chỉ làm việc một nửa ngày hôm nay. :) – Huuuze

+0

phản hồi của webjunkie có vẻ tốt hơn. Chỉ cần học Django bản thân mình. –

+0

Nói chung, không có lý do gì để đề cập rõ ràng trường id trong ORM. Giả sử bạn có một cá thể Tác giả, bạn muốn Book.objects.filter (authorbook__author = author). Nhưng một ManyToManyField là con đường để đi, tất nhiên. –

14

"Tác giả" có vẻ không được mô hình chính xác.

Bạn nên sử dụng một ManyToManyField:

class Book(models.Model): 
    name = models.CharField() 
    authors = models.ManyToManyField(Author) 

Sau đó, bạn có thể làm:

books = Book.objects.filter(authors__id=1) 
+1

+1 cho đề xuất ManyToManyField (đó là cách Django), -1 vì không biết rằng đó là cách nó được thực hiện "dưới mui xe". – Javier

+5

Tất nhiên các mối quan hệ m2m sử dụng các bảng trung gian. Tuy nhiên nó không phải là mô hình chính xác bằng cách sử dụng Django trong trường hợp này. Không có điểm nào trong việc làm cho tôi rõ ràng rằng tôi biết nó hoạt động như thế nào dưới mui xe. – webjunkie

Các vấn đề liên quan