Отображение полей связанных объектов m2o в django-admin - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть модель Job, которая отображается с помощью 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-запросов при каждом рендеринге представления списка и делает его слишком медленным. Есть ли способ запросить необходимую информацию в одном или нескольких запросах?

1 Ответ

1 голос
/ 07 ноября 2019

Вы должны добавить prefetch_related к get_queryset, чтобы предварительно выбрать объекты в одном запросе и уменьшить количество запросов.

Еще пара точек:

  • stop_setэто набор запросов, вы можете вызвать .get() на нем без objects
  • Вы хотите получить stop_set off obj not 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', ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...