添加order_by时Django管理员的性能糟糕的get_form查询集过滤器

时间:2019-02-20 01:52:27

标签: python django django-admin

尝试过滤表单查询集时遇到一些可怕的性能问题。

我正在尝试过滤已经存在关系的模型。

代码成功。

但是我的查询集未排序。

当我更改为form.base_fields['sharepoint_mandate'].queryset = Sharepoint_Mandate.objects.filter(mandate_mapping_2__isnull=True).order_by('product_name')时,查询现在需要25秒

请帮助

models.py

class Mandate_Mapping_2(Trackable):
    mandate_mapping_id = models.AutoField(primary_key=True)  
    sharepoint_mandate = models.ForeignKey(Sharepoint_Mandate, on_delete=models.CASCADE)  
    sharepoint_product = models.ForeignKey(Sharepoint_Product, on_delete=models.CASCADE)  

admin.py

@admin.register(Mandate_Mapping_2)
class ChampMandateMapping2Admin(admin.ModelAdmin): 
    list_display =  ['sharepoint_mandate', 'sharepoint_product', 'approved']

    def get_form(self, request, obj=None, **kwargs):        
        form = super(ChampMandateMapping2Admin, self).get_form(request, obj, **kwargs)

        if 'change' in kwargs:
            if not kwargs['change']:
                form.base_fields['sharepoint_mandate'].queryset = Sharepoint_Mandate.objects.filter(mandate_mapping_2__isnull=True)
        return form

    def get_queryset(self, request):
        return super().get_queryset(request).select_related(
            'sharepoint_product', 
            'sharepoint_mandate',
        )

1 个答案:

答案 0 :(得分:0)

当检查是否存在用于Sharepoint_Mandate的Mandate_Mapping_2时,您将进行额外的查询,一无所有。您可以使用列名属性。

Sharepoint_Mandate.objects.filter(mandate_mapping_2_id=None).order_by('product_name')

您可以查看Django database access optimization docs

中的“直接使用外键值” 部分