繁体   English   中英

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

[英]Showing fields of related m2o objects in django-admin

我有使用 modelAdmin 显示的 model 作业。 我也停止了 model:

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 查询,并且速度太慢。 有没有办法在单个或几个查询中查询所需的信息?

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

还有几点:

  • stop_set是一个查询集,您可以在没有objects的情况下对其调用.get()
  • 你想让stop_set关闭obj而不是self obj ,是Job object,它将引用列表显示中的一行。 selfJobAdmin 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM