2010-06-16 13 views
12

मेरे django मॉडल में से एक बड़ा TextField है जिसे मुझे अक्सर उपयोग करने की आवश्यकता नहीं होती है। क्या इस क्षेत्र में "आलसी लोड" करने के लिए django को बताने का कोई तरीका है? यानी डेटाबेस से इसे खींचने से परेशान न करें जब तक कि मैं स्पष्ट रूप से इसके लिए नहीं पूछता। मैं इस ऑब्जेक्ट को संदर्भित करते समय हर TextField को पाइथन में खींचकर बहुत सारी मेमोरी और बैंडविड्थ बर्बाद कर रहा हूं।क्या मॉडल में django आलसी लोड फ़ील्ड कर सकते हैं?

विकल्प इस क्षेत्र की सामग्री के लिए एक नई तालिका बनाना होगा, लेकिन अगर मैं कर सकता हूं तो मैं उस जटिलता से बचूंगा।

उत्तर

11

मॉडल परिभाषा के बजाय defer() कथन का उपयोग करके, जब आप क्वेरी करते हैं तो कार्यक्षमता होती है। इसे यहां दस्तावेज़ों में देखें: http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

अब, वास्तव में, डेटा को किसी अन्य तालिका में रीफैक्टरिंग और खींचने का आपका वैकल्पिक समाधान वास्तव में एक अच्छा समाधान है। कुछ लोग कहेंगे कि आलसी लोड फ़ील्ड की आवश्यकता का मतलब है कि एक डिज़ाइन दोष है, और डेटा को अलग-अलग मॉडलिंग किया जाना चाहिए था।

किसी भी तरह से काम करता है, यद्यपि!

5

इस तरह के कुछ के लिए आप केवल डिफ़ॉल्ट प्रबंधक को ओवरराइड कर सकते हैं। आमतौर पर, यह सलाह नहीं दी है, लेकिन एक आस्थगित करें() के लिए यह समझ में आता है:

class CustomManager(models.Manager): 
     def get_queryset(self): 
      return super(CustomManager, self).get_queryset().defer('YOUR_TEXTFIELD_FIELDNAME') 

    class DjangoModel(models.Model): 
     objects = CustomerManager() 
5

वहाँ आलसी लोडिंग के लिए दो विकल्प Django में हैं: (फ़ील्ड *) https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.only

  • आस्थगित करें

    उन क्षेत्रों को लोड करने से बचें जिनके लिए उन्हें महंगी प्रसंस्करण की आवश्यकता होती है ताकि उन्हें पाइथन ऑब्जेक्ट्स में परिवर्तित किया जा सके।

    Entry.objects.defer("text")

  • केवल (* क्षेत्रों)

    केवल क्षेत्रों है कि आप वास्तव में

    Person.objects.only("name")

    व्यक्तिगत रूप से, मुझे लगता है कि onlydefer से बेहतर है के बाद से कोड नहीं है की जरूरत है लोड समझने में आसान है, लेकिन लंबे समय तक भी अधिक रखरखाव योग्य है।

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