список детей в родительской модели один ко многим - PullRequest
0 голосов
/ 11 мая 2011

Я учу администратора django, мне нужно модели с отношением один-ко-многим между ними.У меня есть что-то вроде модели «Производитель», где я могу добавить разных производителей автомобилей, и «Модель автомобиля» для добавления автомобилей.На моей странице администрирования django я хочу иметь возможность отображать список всех автомобилей, созданных, скажем, factory1, когда я нажимаю на запись Manufacturer1.

Я нашел хитрость, используя модель Inline в модели администратора производителя, проблема в том, чтоон загружает каждую запись в базу данных и занимает некоторое время, так как это большая таблица.

Есть ли другой способ сделать это или мне нужно создать новый шаблон?

РЕДАКТИРОВАТЬ: Цель состоит не в том, чтобы загрузить каждый Автомобиль, который является FK, в Производитель1, как в InlineModelAdmin, а в том, чтобы получить то же отображение, что и в display_list с результатами, разбитыми на страницы

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Ответьте на ваш обновленный вопрос:

способ сделать это можно с помощью ProxyModels и переопределением ModelAdmin.queryset

Вы расширяете Carмодели через FordCar, GMCar и используйте proxy=True в классе Meta для обоих.

Затем вы можете зарегистрировать отдельных администраторов для каждого из FordCar и GMCar и переопределитьМетод набора запросов в каждом из этих ModelAdmin для фильтрации для соответствующего производителя.

Пример:

class FordCarAdmin(admin.ModelAdmin)
    list_display = fields = ['name','model','engine']

    def queryset(self,request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(manufacturer__name='Ford')

admin.site.register(FordCar,FordCarAdmin)
1 голос
/ 11 мая 2011

У вас есть два варианта.

Самый простой подход - посмотреть на отношения в обратном порядке. Вместо того, чтобы идти к производителю, менять форму и видеть все свои машины. Перейти к списку изменений автомобилей и фильтровать по производителю. Вам нужно установить атрибут list_filter на автомобиле ModelAdmin, чтобы включить производителя.

Вариант 2 будет огромной болью, но вы можете переопределить change_view для производителя ModelAdmin, чтобы добавить список машин этого производителя в extra_context. Затем вам придется переопределить шаблон администратора в «templates / admin / yourapp / Manufacturer / change_form.html". Затем вы можете добавить этот шаблон для создания списка, который вы ищете, используя список автомобилей, которые вы передали в extra_context, опираясь на «django / contrib / admin / templates / change_list.html» для вдохновения. *

Внимательно прочитайте Django документы по Admin . Там на самом деле огромное количество информации.

1 голос
/ 11 мая 2011

Тебе не нужен взлом. Администратор Django отображает только Автомобили, имеющие FK для Изготовителя1, когда вы выбираете Изготовителя1, если вы использовали InlineModelAdmin вправо и в соответствии с назначением.

...