首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django-admin中显示相关m2o对象的字段

在django-admin中显示相关m2o对象的字段
EN

Stack Overflow用户
提问于 2019-11-01 07:31:01
回答 1查看 94关注 0票数 0

我有模型作业,这是用modelAdmin显示的。我还有个停下来的模型:

代码语言:javascript
复制
class Stop(models.Model):
    ...
    job = models.ForeignKey(to=Job, ...)
    stop_number = ...
    ...

作业可以从2到3站。

我尝试使用以下方法显示第一站和第二站的名称:

代码语言:javascript
复制
@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查询,而且速度太慢。是否有一种方法可以在单个查询中查询所需的信息?还是只有少数几个查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-07 14:50:57

您应该将prefetch_related添加到get_queryset中,以预取一个查询中的对象,并减少查询的数量。

还有几点:

  • stop_set是一个查询集,您可以在它上调用.get(),而不需要objects
  • You来使stop_set脱离obj而不是selfobjJob对象,它将引用列表显示中的一行。selfJobAdmin类。

代码语言:javascript
复制
@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', ...)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58655645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档