2015-04-15 39 views
5

मॉडलों के साथ अजगर 3.4.1 पर Django 1.8 का उपयोग करना:Django व्यवस्थापक इनलाइन: select_related

class Product(models.Model): 
    name = models.CharField(max_length=255) 
    # some more fields here 

    def __str__(self): 
     return self.name 


class PricedProduct(models.Model): 
    product = models.ForeignKey(Product, related_name='prices') 
    # some more fields here 

    def __str__(self): 
     return str(self.product) 

class Coming(models.Model): 
    # some unimportant fields here 


class ComingProducts(models.Model): 
    coming = models.ForeignKey(Coming) 
    priced_product = models.ForeignKey(PricedProduct) 
    # more unimportant fields 

और निम्नलिखित admin.py:

class ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): 
    model = ComingProducts 


class ComingAdmin(admin.ModelAdmin): 
    inlines = [ComingProductsInline] 
बेशक

, मैं गुणा प्रश्नों के साथ एक समस्या है डेटाबेस में: मेरे पास सूची में प्रत्येक आइटम और प्रत्येक पंक्ति के लिए एक क्वेरी के लिए एक क्वेरी है। इसलिए, 100 आइटम होने पर मुझे 100^2 प्रश्न मिलते हैं। मैंने Caching queryset choices for ModelChoiceField or ModelMultipleChoiceField in a Django form के साथ प्रत्येक पंक्ति के लिए प्रश्नों के साथ समस्या हल की है लेकिन मुझे अभी भी str विधि के साथ समस्या है। मैं कोशिश की है निम्नलिखित:

1) ComingAdmin को prefetch_related जोड़ना:

def get_queryset(self, request): 
    return super(ComingAdmin, self).get_queryset(request). \ 
    prefetch_related('products__product') 

2) ComingProductInline को select_related जोड़ना:

def get_queryset(self, request): 
    return super(ComingProductsInline, self).get_queryset(request). \ 
    select_related('priced_product__product') 

3) इनलाइन के लिए कस्टम प्रपत्र को परिभाषित करने के लिए और select_related जोड़ने फ़ील्ड क्वेरीसेट:

class ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): 
    model = ComingProducts 
    form = ComingProductsAdminForm 

class ComingProductsAdminForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
       super(ComingProductsAdminForm, self).__init__(args, kwargs) 
       self.fields['priced_product'].queryset = PricedProduct.objects.all(). \ 
       select_related('product') 

    class Meta: 
     model = ComingProducts 
     fields = '__all__' 

4) एक कस्टम फॉर्मेट परिभाषित करना:

class ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): 
    model = ComingProducts 
    formset = MyInlineFormset 

class MyInlineFormset(BaseInlineFormSet): 
    def __init__(self, data=None, files=None, instance=None, 
      save_as_new=False, prefix=None, queryset=None, **kwargs): 
     super(MyInlineFormset, self).__init__(data, files, instance, 
              save_as_new, prefix, queryset, **kwargs) 
     self.queryset = ComingProducts.objects.all(). \ 
     prefetch_related('priced_product__product') 

5) पिछले 4 तरीकों

और कुछ नहीं के लिए विभिन्न संयोजनों में मदद करता है: PricedProduct के लिए str के प्रत्येक कॉल उत्पाद तालिका के लिए एक प्रश्न प्रदर्शन करने के लिए Django बनाता है। इन सभी विधियों का उल्लेख स्टैक ओवरफ्लो पर किया गया था, लेकिन उन्होंने मॉडलएडमिन का इलाज किया, और इनलाइन के साथ मदद नहीं करते हैं। मुझे क्या याद आती है?

उत्तर

1

मैं वर्तमान में एक ही समस्या पर काम कर रहा हूं। जो मैंने पाया है वह इस धागे पर प्रलेखित है: Translatable Manytomany fields in admin generate many queries

एक महत्वपूर्ण अवलोकन मैंने किया है कि मेरा समाधान केवल Django 1.7x के लिए काम करता है और 1.8 के लिए नहीं। बिल्कुल वही कोड, d1.7 के साथ मेरे पास 10^1 प्रश्नों का क्रम है, और d1.8 की नई स्थापना के साथ मेरे पास 10^4 है।

3

formset समाधान मेरे लिए काम करता है, लेकिन एक अलग दृष्टिकोण के साथ:

class MyInlineFormset(BaseInlineFormSet): 
    def __init__(self, *args, **kwargs): 
     super(MyInlineFormset, self).__init__(*args, **kwargs) 
     self.queryset = self.queryset.prefetch_related('priced_product__product') 

BaseInlineFormSet वर्ग आप के लिए क्वेरीसमूह फिल्टर, और आप जिसे फ़िल्टर क्वेरीसमूह लेने के लिए और प्रीफ़ेच जोड़ने की जरूरत है। आपके फॉर्मेट कार्यान्वयन (सभी() क्वेरीसेट) के साथ आप असंबद्ध ComingProduct ऑब्जेक्ट प्राप्त करते हैं और इसे प्रस्तुत करने में बहुत अधिक समय लगता है। जब यह फ़िल्टर की गई क्वेरीसेट होती है तो यह बहुत तेज़ी से प्रस्तुत होती है।

+0

ओह। यह एक जीवन बचतकर्ता है। मेरे पास मॉडल ए था, जिसमें मॉडल बी बी के कई इनलाइन थे, जिनमें तीन एम 2 एम और दो एफके रिश्ते थे। इसके अलावा। मॉडल अनुवाद का इस्तेमाल किया गया था। इसके अलावा, ग्रैपपेली ने अपनी स्वतः पूर्ण मदद की। दुर्भाग्यवश – Aitvaras

+0

, यह Django 2.0 – ramusus

+0

में कैसे काम नहीं करता है? ऐसा लगता है कि Django का प्रासंगिक कोड बदल गया है – noamk

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