简体   繁体   English

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

[英]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()
  • You want to 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. 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