【问题标题】:Slow loading Django Admin change/add缓慢加载 Django Admin 更改/添加
【发布时间】:2019-04-03 01:30:07
【问题描述】:

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

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

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

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

什么时候使用exclude = ['e_vehicle','e_product'],添加/更改屏幕会立即加载也就不足为奇了。

大家有什么意见

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 大约有 17K(具有 eManager 的 fkey)

eVehicle 大约有 25K(具有 eProduct 的 fkey)

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

【问题讨论】:

标签: python django django-forms


【解决方案1】:

可以看出e_producte_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__'

这会将原始 id 保留为小部件。你可以得到类似下面的东西。

除了输入之外,您还可以通过点击搜索按钮来添加其他条目。

当您在ModelChoiceField 中有很多选择时,这是更好的选择

【讨论】:

  • 我知道这是一个单独的问题,但相关,有没有办法为添加和更改加载不同的表单?
  • 是的,有可能!您可以检查django.contrib.admin.options.ModelAdmin 类的_changeform_view() 方法和add_view()。然而,这不是写大答案的好地方:)
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 2021-09-14
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2018-07-06
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多