Django管理员列表显示-根据自定义名称预取

Django管理员列表显示-根据自定义名称预取,django,django-admin,Django,Django Admin,我已经为我的列表显示创建了一些自定义名称,但它们在我的管理列表显示中生成了500多个查询。我添加了一个select和prefetch查询集(在编辑表单上工作),看起来已经减少了一些列表显示 但是,我认为get_xxx字段也需要预取?但我不知道该怎么做 class DeviceCircuitSubnetsAdmin(admin.ModelAdmin): search_fields = ['device__hostname','circuit__ref_no','subnet__subnet

我已经为我的列表显示创建了一些自定义名称,但它们在我的管理列表显示中生成了500多个查询。我添加了一个select和prefetch查询集(在编辑表单上工作),看起来已经减少了一些列表显示

但是,我认为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
有三件事,亚历克斯

  • ModelAdmin应该定义
    get\u queryset
    函数,而不是
    queryset
  • 一个与
    预回迁\u相关的
    调用中有一个输入错误,代码没有因为第1点而失败)
  • 您在
    prefetch\u中列出的所有字段是否都与外键相关?因为您应该只在这种情况下使用预取相关
  • 一般来说,不要担心get_xxx函数。它们将起作用 在使用queryset获取的对象上-因此如果您获取
    需要时,将不会有其他查询。

    谢谢,就是这样,我现在有8个查询,而不是1000个