2011-11-29 12 views
8

निम्नलिखित मॉडल को देखते हुए, Django पहली बार पहुंचने के बाद संबंधित वस्तुओं को कैश करता है?क्या Django कैश विदेशी कुकी और ManyToManyField फ़ील्ड से संबंधित होने पर संबंधित है?

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

उदाहरण के लिए:

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 

नोट: वर्तमान में Django 1.3 के साथ काम है, लेकिन यह पता है कि अन्य संस्करणों में उपलब्ध है अच्छा है।

उत्तर

5

पहले उदाहरण में the second query is cached दूसरे मामले (मेरा मानना ​​है कि) वे दोनों का कारण होगा एक डीबी मारा जब तक आप मूल प्रश्न पर select_related का उपयोग में:

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

संपादित

के बारे में मैं गलत हूँ दूसरा उदाहरण यदि आप मूल क्वेरी में select_related का उपयोग करते हैं, तो आप फिर से डेटाबेस को हिट नहीं करेंगे (विदेशीकी तुरंत कैश किया गया है)। यदि आप select_related का उपयोग नहीं करते हैं, तो आप पहली क्वेरी पर डीबी हिट करेंगे लेकिन दूसरी क्वेरी कैश की जाएगी।

से:

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

आगे पहुँच एक-से-कई लोगों के लिए रिश्तों को पहली बार संबंधित वस्तु पहुँचा जा सकता है कैश किया गया है। उसी ऑब्जेक्ट इंस्टेंस पर विदेशी कुंजी के बाद की पहुंच कैश की जाती है।

ध्यान दें कि select_related() QuerySet विधि समय से पहले सभी से कई रिश्तों के कैश को दोबारा पूर्ववत करता है।

+2

अभी भी सही नहीं है। कई बहुत सारे प्रश्नों को कैश नहीं किया जाता है - वे वास्तव में एफके लुकअप को रिवर्स करने के बराबर हैं, इसलिए 1.4 में नई 'prefetch_related' कार्यक्षमता का उपयोग करते समय कैश न करें। –

+0

धन्यवाद। जब आवश्यक हो तो मैं कई सारे क्षेत्रों में कैशिंग को संभालेगा। – bpscott

+0

उत्तर को ठीक करने और अभी तक बेहतर परीक्षण करने की आवश्यकता है। मुझे डीजे 1.5 में किसी भी मामले में कैशिंग नहीं दिख रहा है। – Bryce

संबंधित मुद्दे