2011-11-29 19 views
8

Với mô hình sau, Django có lưu vào bộ nhớ cache các đối tượng liên quan sau lần đầu tiên chúng được truy cập không?Trường Django cache có liên quan đến các trường ForeignKey và ManyToManyField khi chúng được truy cập không?

class Post(models.Model): 
    authors = models.ManyToManyField(User) 
    category = models.ForeignKey(Category) 

Ví dụ:

post = Post.objects.get(id=1) 

# as i understand this hits the database 
authors1 = post.authors.all() 
# does this his the database again? 
authors2 = post.authors.all() 

# as i understand this hits the database 
category1 = post.category 
# does this hit the database again? 
category2 = post.category 

Lưu ý: hiện đang làm việc với Django 1.3, nhưng đó là tốt để biết những gì có sẵn trong các phiên bản khác.

Trả lời

5

Trong ví dụ đầu tiên the second query is cached. Trong trường hợp thứ hai (Tôi tin) cả hai đều sẽ gây ra một DB nhấn trừ khi bạn sử dụng select_related trên truy vấn ban đầu:

post = Post.objects.select_related('category').get(id=1) 

EDIT

tôi sai về ví dụ thứ hai. Nếu bạn sử dụng select_related trong truy vấn ban đầu, bạn sẽ không đánh lại cơ sở dữ liệu nữa (The ForeignKey được lưu trữ ngay lập tức). Nếu bạn không sử dụng select_related, bạn sẽ nhấn DB trên truy vấn đầu tiên nhưng truy vấn thứ hai sẽ được lưu vào bộ nhớ cache.

Từ:

https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-many-relationships

Chuyển tiếp cận với một-nhiều mối quan hệ được lưu trữ lần đầu tiên các đối tượng liên quan được truy cập. Các truy cập tiếp theo tới khóa ngoài trên cùng một cá thể đối tượng được lưu trữ.

Lưu ý rằng phương thức select_related() QuerySet đệ quy chuẩn bị lại bộ nhớ cache của tất cả các mối quan hệ một-nhiều trước thời hạn.

+2

Vẫn chưa hoàn toàn đúng. Các truy vấn ManyToMany không được lưu trữ ở tất cả - chúng thực sự chỉ tương đương với các tra cứu FK ngược lại, do đó, không được lưu trữ ngoại trừ khi sử dụng chức năng 'prefetch_related' mới trong 1.4. –

+0

Cảm ơn. Tôi sẽ tự xử lý bộ nhớ đệm trên các trường ManyToMany khi cần thiết. – bpscott

+0

Câu trả lời cần được khắc phục và kiểm tra tốt hơn. Tôi không thấy bộ nhớ đệm trong cả hai trường hợp trong DJ 1.5. – Bryce

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