我已经为我的列表显示创建了一些自定义名称,但它们在我的管理员列表显示中生成了 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
三件事亚历克斯。
- 模型管理员应该定义
get_queryset
函数,而不是queryset
。 prefetch_related
调用中的一个有拼写错误,代码不会因为第 1 点而失败(- 您列出的所有字段
prefetch_related
都是外键吗?因为在这种情况下,您应该仅使用与预取相关的预取。
一般来说,不要担心get_xxx功能。他们会工作 在使用查询集获取的对象上 - 因此,如果您获取的内容 需要,不会有其他查询。