缓慢加载Django Admin更改/添加

时间:2019-04-03 01:30:08

标签: python django django-forms

我正在制作一个经典的单视图应用程序,映射多个 数据源。

Django-admin是分页的,因此当我查看列表时没有影响,问题是当我想要更改/添加列表时。

使用调试工具栏,查询看起来不错,我认为它们不会花费很长时间。

我尝试在这里Django admin change form load quite slow使用建议并创建了一个表格,但这没有影响。

使用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,000(具有eManager的密钥)

eVehicle大约有25K(具有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 个答案:

答案 0 :(得分:1)

可以看出444e_product表中的值太多。您正在使用e_vehicle,这意味着在HTML下拉列表中会有〜17K-25K选项,这会减慢渲染速度,有时会挂在客户端。

解决方案

编辑您的 forms.py

ChoiceField

这会将原始ID保留为小部件。您可以看到类似以下的内容。

enter image description here

您可以通过点击输入以外的搜索按钮来添加其他条目。

当您在 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__' 中有很多选择时,这是一个更好的选择