2012-02-07 36 views
33

Tôi đã thử prefetch_related() trong django 1.4 từ thân cây và không thể làm cho nó để tìm nạp trước tra cứu ngược lại.Django: Không prefetch_related() theo tra cứu mối quan hệ ngược lại?

mô hình đơn giản của tôi (mỗi cuốn sách có nhiều giá):

class Book(models.Model): 
    # some fields 

class Price(models.Model): 
    book = models.ForeignKey(Book) 

Quan điểm của tôi của truy vấn:

books = Book.objects.prefetch_related('price') 

Sau đó, tôi nhận được thông AttributeError:

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related() 

Làm thế nào để lam cho no hoạt động? Cảm ơn.

+14

sách = Book.objects.prefetch_related ('price_set') – Acute

+2

@Jonathanz: Bạn nên đặt nhận xét của mình làm câu trả lời được chấp nhận, nghĩa là 'prefetch_related ('price_set')' – Medorator

Trả lời

61

Xác định một tên liên quan:

class Price(models.Model): 
    book = models.ForeignKey(Book, related_name='prices') 

và sau đó sử dụng nó:

books = Book.objects.prefetch_related('prices') 
+31

Câu trả lời của bạn nhắc tôi về FOO_set để chỉnh sửa cũng có thể được .prefetch_related ('price_set'). BTW, Cảm ơn rất nhiều – Tianissimo

+1

Tôi không thể tái tạo điều này trong trình bao. Vẫn thực hiện các truy vấn riêng biệt, tôi đã mong đợi sự tham gia. – pdvyas

+0

Xin chào! Tôi cũng đã thử điều này, nhưng như @pdvyas nói, có những truy vấn riêng biệt. Điều này không làm cho một tham gia ... – Anton

0

Khi bạn không có định nghĩa một related_name cho mối quan hệ, mối quan hệ ngược có _set nối. Đây là trường hợp khi truy cập vào mối quan hệ ngược từ một đối tượng (ví dụ some_book.price_set.all()), nhưng điều này cũng hoạt động trên prefetch_related:

books = Book.objects.prefetch_related('price_set') 

Lưu ý rằng điều này dường như khác biệt so với bộ lọc, mà không chấp nhận tên của mô hình khác không có _set (ví dụ: Books.objects.filter(price__currency='EUR')).

Ở trên đã được thử nghiệm với 1.11.8 (không phải trên mã cụ thể này, nhưng trên mã của riêng tôi, tương tự).

Hoặc, bạn có thể thêm related_name, như được hiển thị bởi Jan Pöschko ở trên.

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