我有模型作业,这是用modelAdmin显示的。我还有个停下来的模型:
class Stop(models.Model):
...
job = models.ForeignKey(to=Job, ...)
stop_number = ...
...作业可以从2到3站。
我尝试使用以下方法显示第一站和第二站的名称:
@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', ...)但是它在每个列表视图呈现上执行了许多SQL查询,而且速度太慢。是否有一种方法可以在单个查询中查询所需的信息?还是只有少数几个查询?
发布于 2019-11-07 14:50:57
您应该将prefetch_related添加到get_queryset中,以预取一个查询中的对象,并减少查询的数量。
还有几点:
stop_set是一个查询集,您可以在它上调用.get(),而不需要objectsstop_set脱离obj而不是self。obj是Job对象,它将引用列表显示中的一行。self是JobAdmin类。@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', ...)https://stackoverflow.com/questions/58655645
复制相似问题