Django 管理员列表显示 - 针对自定义名称进行预取



我已经为我的列表显示创建了一些自定义名称,但它们在我的管理员列表显示中生成了 500 多个查询。我添加了一个选择和预取 QuerySet(适用于编辑表单(,并且看起来已经减少了一些列表显示。

但是我认为get_xxx字段也需要预取? 但是不确定如何做到这一点?

class DeviceCircuitSubnetsAdmin(admin.ModelAdmin):
    search_fields = ['device__hostname','circuit__ref_no','subnet__subnet_type__subnet_type','subnet__subnet',]
    list_display = ('get_device','get_circuit','get_subnet','get_subnet_type')
    def queryset(self, request):
        return super(DeviceCircuitSubnetsAdmin, self).queryset(request) 
                                                    .select_related('circuit') 
                                                    .select_related('device') 
                                                    .select_related('subnet') 
                                                    .prefetch_related('device__site_') 
                                                    .prefetch_related('circuit__circuit_type') 
                                                    .prefetch_related('circuit__provider') 
                                                    .prefetch_related('subnet__subnet_type') 
    def get_device(self, obj):
        return obj.device.site
    get_device.admin_order_field  = 'device'  #Allows column order sorting
    get_device.short_description = 'Device'  #Renames column head
    def get_circuit(self, obj):
        try:
            return obj.circuit.ref_no
        except: 
            return ''
    get_circuit.admin_order_field  = 'circuit__ref_no'  #Allows column order sorting
    get_circuit.short_description = 'Ref No'  #Renames column head
    def get_subnet(self, obj):
        return obj.subnet.subnet
    get_subnet.admin_order_field  = 'subnet__subnet'  #Allows column order sorting
    get_subnet.short_description = 'Subnet'  #Renames column head
    def get_subnet_type(self, obj):
        return obj.subnet.subnet_type
    get_subnet_type.admin_order_field  = 'subnet__subnet_type__subnet_type'  #Allows column order sorting
    get_subnet_type.short_description = 'Subnet Type'  #Renames column head

三件事亚历克斯。

  1. 模型管理员应该定义get_queryset函数,而不是queryset
  2. prefetch_related调用中的一个有拼写错误,代码不会因为第 1 点而失败(
  3. 您列出的所有字段prefetch_related都是外键吗?因为在这种情况下,您应该仅使用与预取相关的预取。

一般来说,不要担心get_xxx功能。他们会工作 在使用查询集获取的对象上 - 因此,如果您获取的内容 需要,不会有其他查询。

最新更新