2013-05-26 9 views
6

मेरी Django वेबसाइटों में से एक डेटाबेस मॉडल निम्नलिखित है: Django अनुप्रयोग "आम" में:Django व्यवस्थापक परिवर्तन प्रपत्र लोड काफी धीमी गति से

class Collection(models.Model): 
    name = models.CharField(max_length = 255, unique = True) 
    _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) 

class Particle(models.Model): 
    content = models.TextField(blank=False) 
    owner = models.ForeignKey(Collection) 
    order = models.IntegerField(null=True, blank=True) 

Django अनुप्रयोग में "सिटकॉम":

class Media(models.Model): 
    name = models.CharField(max_length = 248) 
    _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) 
    capital = models.CharField(max_length = 1) 
    description = models.TextField(blank=True) 
    progress = models.CharField(max_length = 32, blank=True, null=True) 

class Relation(models.Model): 
    name = models.CharField(max_length = 128) 
    _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) 
    description = models.TextField(blank=True) 
    parent = models.ForeignKey('self', blank=True, null=True) 
    order = models.IntegerField(blank=True, null=True) 
    particle = models.ForeignKey(Particle, blank=True, null=True) 
    media = models.ForeignKey(Media, blank=True, null=True) 

में लघु, मॉडल श्रेणी संबंध में अन्य टेबलों के लिए 3 विदेशी कुंजी हैं। समस्या यह है कि, जब मैं एक संबंध बदलने के लिए Django व्यवस्थापक का उपयोग करता हूं, तो पृष्ठ (change_form) लोड धीरे-धीरे लोड होता है। बाद में, मैं निम्नलिखित के रूप में मॉडल वर्ग संबंध बदल दिया है:

class Relation(models.Model): 
    name = models.CharField(max_length = 128) 
    _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) 
    description = models.TextField(blank=True) 
    order = models.IntegerField(blank=True, null=True) 
    parent_id = models.IntegerField(blank=True, null=True) 
    particle_id = models.IntegerField(blank=True, null=True) 
    media_id = models.IntegerField(blank=True, null=True) 

संशोधन IntegerFields को विदेशी कुंजी बदल गया है, तो यह Django ORM प्रणाली के अंदर magics से कुछ परिवर्तन प्रपत्र पृष्ठ लोड वास्तव में तेजी से अक्षम है, और अब। मेरा सवाल है, "django orm के अंदर अक्षम जादूगर" क्या है? समस्या का कारण बनने की क्या संभावना है?

उत्तर

9

यह django Orm का जादू नहीं है। यह फॉर्म का जादू है। जब आप मॉडल में एक विदेशी कुंजी बनाते हैं, तो मॉडलफॉर्म में, मॉडलचॉइसफ़ील्ड बनाता है जिसमें विदेशीकी मॉडल के सभी विकल्प होते हैं। और django व्यवस्थापक HTML बनाने के लिए फ़ॉर्म के सभी गुणों का उपयोग करता है। तो इस कोड का उपयोग करें।

from django import forms 
class RelationForm(forms.ModelForm): 
    parent = forms.ChoiceField(required=False, 
           choices=Relation.objects.values_list('id', 'name')) 
    particle = forms.ChoiceField(required=False, 
           choices=Particle.objects.values_list('id', 'content')) 
    media = forms.ChoiceField(required=False, 
           choices=Media.objects.values_list('id', 'name')) 

    class Meta: 
     model = Relation 

Admis साइट में

from django.contrib import admin 
class RelationAdmin(admin.ModelAdmin): 
    form = RelationForm 
    model = Relation 

तुम भी कैश कर सकते विकल्प एक रूप में गुजरती हैं।

+0

बहुत बहुत धन्यवाद! यह काम करता है, और अब मैं फिर से विदेशीकी का उपयोग कर सकता हूं, यह और अधिक सुविधा है। – Brent81

3

मैं इस मुद्दे को शर्त लगाने के लिए तैयार हूं ForeignKey के कारण। डिफ़ॉल्ट रूप से, django प्रत्येक विदेशी कुंजी के लिए <select> तत्व प्रस्तुत करता है।

यदि आपके पास हजारों पंक्तियां हैं, तो यह आसानी से आपके एचटीएमएल/डोम को फटकारना शुरू कर देता है और मैंने देखा है कि ब्राउज़र <select> टैग में दिए गए 20k आइटमों पर बाहर निकलने लगते हैं।

इसे ठीक करने के लिए, अपने व्यवस्थापक फॉर्म को ओवरराइड करने और डिफ़ॉल्ट विजेट का उपयोग न करने के लिए देखें।

12

admin.py में

from django.contrib import admin 

class RelationAdmin(admin.ModelAdmin): 
     raw_id_fields = ('Media','Particle',) 

admin.site.register(Relation, RelationAdmin) 

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

+1

धन्यवाद! यह छोटी सी युक्ति मेरी व्यवस्थापक साइट को और अधिक उपयोगी बनाती है! – yairchu

+1

कभी-कभी आप व्यवस्थापक फॉर्म में फ़ील्ड को संपादित नहीं करना चाहते हैं, बस उन्हें देखें, आप 'readonly_fields = (' Media ',' particicle ',) भी जोड़ सकते हैं। –

0

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

from django.contrib import admin 
class RelationAdmin(admin.ModelAdmin): 
     fields = ('name',) 
admin.site.register(Relation, RelationAdmin) 

फिर समस्या का कारण बनने वाले फ़ील्ड को जोड़ने के बाद, उदा। मीडिया, फॉर्म फिर से जमा हो जाएगा। इसलिए, अगर आप अभी भी फार्म पर इस क्षेत्र की जरूरत है आप raw_id_fields = ('मीडिया',)

0

मेरे मामले में सुस्ती पुराना django-debug-toolbar (v1.7) द्वारा मुख्य रूप से कारण होता था साथ विशाल शाह के जवाब का उपयोग कर सकते हैं। debug_toolbar.middleware.DebugToolbarMiddleware व्यवस्थापक पृष्ठ को 20 मिनट तक लोड करने का कारण बनता है यदि इसमें दो सौ विकल्प वाले विदेशीकी फ़ील्ड शामिल है। V1.8 को टूलबार को अपग्रेड करने से सबकुछ हल हो गया।शायद यह किसी की मदद करता है।

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