отображаемый список дочерних элементов в родительской модели «один ко многим»

#python #django #foreign-key-relationship #displaylist

#python #django #отношение внешнего ключа #отображаемый список

Вопрос:

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

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

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

Редактировать:Цель состоит не в том, чтобы загружать каждый Car, который является FK, в Manufacturer1, как с помощью InlineModelAdmin, а в том, чтобы получить тот же дисплей, что и с помощью display_list, с разделением результатов на страницы

Ответ №1:

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

способ сделать это может заключаться в использовании ProxyModels и переопределении ModelAdmin.queryset

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

Затем вы можете зарегистрировать отдельных администраторов для каждого из FordCar и GMCar и переопределить метод queryset в каждом из этих 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. Спасибо, что касается вашего примера, я не знал о прокси-моделях, однако я не смогу динамически создавать новых производителей, если мне придется создавать ModelAdmin каждого бренда.

Ответ №2:

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

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

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

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

Комментарии:

1. Мне нравится идея list_filter!

Ответ №3:

Вам не нужен никакой взлом. Администратор Django отображает только автомобили, у которых есть FK для Manufacturer1, при выборе Manufacturer1, если вы правильно и по назначению использовали InlineModelAdmin.

Комментарии:

1. Да, вы правы, но с помощью InlineModelAdmin он загружает все машины, у которых есть Fk в Manufacturer1, однако display_list разбивает их на страницы, что очень удобно для огромных записей