Медленная загрузка Django Admin изменить / добавить - PullRequest
2 голосов
/ 03 апреля 2019

Я делаю классическое приложение с одним представлением, отображая несколько источники данных.

Django-admin разбит на страницы, поэтому при просмотре списка это никак не сказывается, проблема в том, что я хочу изменить / добавить его.

Используя панель инструментов отладки, мои запросы выглядят нормально, я не думаю, что они занимают много времени.

Я попытался использовать предложение здесь Загрузка формы администратора Django довольно медленно и создала форму, но это никак не отразилось.

Когда используется exclude = ['e_vehicle','e_product'] Не удивительно, что добавление / изменение экранов загружается мгновенно.

Любые мысли, пожалуйста

enter image description here

model.py

class Product_Mapping(Trackable):
    product_mapping_id = models.AutoField(primary_key=True)   
    s_product =  models.OneToOneField(sProduct, on_delete=models.CASCADE)
    e_fund_manager = models.ForeignKey(eManager, models.DO_NOTHING, blank=True, null=True)
    e_product = models.ForeignKey(eProduct, models.DO_NOTHING, blank=True, null=True)
    e_vehicle = models.ForeignKey(eVehicle, models.DO_NOTHING, blank=True, null=True)

eManager имеет около 3K

eProduct имеет около 17 КБ (от fkey до eManager)

eVehicle имеет около 25 КБ (имеет fkey для eProduct)

form.py

class MappingProductForm(forms.ModelForm):
    s_product = forms.ChoiceField(required=False,
                            choices=sProduct.objects.values_list('final_publications_product_id', 'product_name'))
    e_fund_manager = forms.ChoiceField(required=False,
                            choices=eManager.objects.values_list('e_fund_manager_id', 'manager_name'))
    e_product = forms.ChoiceField(required=False,
                            choices=eProduct.objects.values_list('e_product_id', 'product_name'))
    e_vehicle = forms.ChoiceField(required=False,
                            choices=eVehicle.objects.values_list('e_vehicle_id', 'formal_vehicle_name'))

    class Meta:
        model = Product_Mapping
        fields = '__all__'

admin.py

@admin.register(Product_Mapping)
class ChampProductMappingAdmin(admin.ModelAdmin): 
    form = MappingProductForm

1 Ответ

1 голос
/ 03 апреля 2019

Видно, что в таблицах e_product и e_vehicle слишком много значений. Вы используете ChoiceField, это означает, что в раскрывающемся списке HTML будут параметры ~ 17K-25K, которые замедляют рендеринг и иногда зависают на стороне клиента.

Решение

отредактируйте forms.py


from django.contrib.admin.widgets import ForeignKeyRawIdWidget

class MappingProductForm(forms.ModelForm):


    def __init__(self, *args, **kwargs):
        super(MappingProductForm, self).__init__(*args, **kwargs)
        rel_model = self.Meta.model
        rel_eprod = rel_model._meta.get_field('e_product').rel
        rel_eprod = rel_model._meta.get_field('e_vehicle').rel
        self.fields['e_product'].widget = ForeignKeyRawIdWidget(rel_eprod, admin_site=admin.site)
        self.fields['e_vehicle'].widget = ForeignKeyRawIdWidget(rel_eprod, admin_site=admin.site)

    s_product = forms.ChoiceField(required=False,
                            choices=sProduct.objects.values_list('final_publications_product_id', 'product_name'))
    e_fund_manager = forms.ChoiceField(required=False,
                            choices=eManager.objects.values_list('e_fund_manager_id', 'manager_name'))
    e_product = forms.ModelChoiceField(required=False,
                            choices=eProduct.objects.all())
    e_vehicle = forms.ModelChoiceField(required=False,
                            choices=eVehicle.objects.all()
                            )

    class Meta:
        model = Product_Mapping
        fields = '__all__'

Это сохранит необработанный идентификатор как виджет. Вы можете получить что-то вроде ниже.

enter image description here

Вы можете добавить другие записи, нажав кнопку поиска, кроме ввода.

Это лучший вариант, когда у вас есть много вариантов в ModelChoiceField

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...