[英]Showing fields of related m2o objects in django-admin
I have model Job which is shown using modelAdmin.我有使用 modelAdmin 显示的 model 作业。 And also I have stop model:
我也停止了 model:
class Stop(models.Model):
...
job = models.ForeignKey(to=Job, ...)
stop_number = ...
...
Job can have from 2 to 3 stops.作业可以有 2 到 3 个停靠点。
I've tried to show first and second stop names using:我尝试使用以下方法显示第一站和第二站名称:
@admin.register(Job)
class JobAdmin(admin.ModelAdmin):
def stop_1(self, obj):
stop = self.stop_set.objects.get(stop_number=1)
return stop.name
def stop_2(self, obj):
stop = self.stop_set.objects.get(stop_number=2)
return stop.name
list_display = ('stop_1', 'stop_2', ...)
But it does many SQL queries on each list view rendering and makes it way too slow.但它对每个列表视图渲染执行许多 SQL 查询,并且速度太慢。 Is there a way to query needed info in single or just few queries?
有没有办法在单个或几个查询中查询所需的信息?
You should add prefetch_related
to get_queryset
to prefetch the objects in one query and reduce the number of queries.您应该将
prefetch_related
添加到get_queryset
以在一个查询中预取对象并减少查询次数。
A couple more points:还有几点:
stop_set
is a queryset, you can call .get()
on it without objects
stop_set
是一个查询集,您可以在没有objects
的情况下对其调用.get()
stop_set
off obj
not self
.stop_set
关闭obj
而不是self
。 obj
, is the Job
object, which will refer to a row in the list display. obj
,是Job
object,它将引用列表显示中的一行。 self
is the JobAdmin
class. self
是JobAdmin
class。@admin.register(Job)
class JobAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request).prefetch_related('stop_set')
return qs
def stop_1(self, obj):
stop = obj.stop_set.get(stop_number=1)
return stop.name
def stop_2(self, obj):
stop = obj.stop_set.get(stop_number=2)
return stop.name
list_display = ('stop_1', 'stop_2', ...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.