#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 разбивает их на страницы, что очень удобно для огромных записей