Встроенный администратор Django: select_related ⇐ Python
-
Гость
Встроенный администратор Django: select_related
Использование Django 1.8 на Python 3.4.1 с моделями:
класс Продукт(модели.Модель): имя = модели.CharField(max_length=255) # еще несколько полей здесь защита __str__(сам): вернуть свое имя. класс PricedProduct(models.Model): продукт = модели.ForeignKey(Продукт, связанное_имя='цены') # еще несколько полей здесь защита __str__(сам): вернуть ул (self.product) класс Coming(models.Model): # здесь несколько неважных полей класс ComingProducts(models.Model): ближайшие = модели.ForeignKey(Приближается) Priced_product = models.ForeignKey(PricedProduct) Еще # неважных полей и следующий admin.py:
класс ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): модель = ComingProducts класс ComingAdmin(admin.ModelAdmin): inlines = [ComingProductsInline] Конечно, у меня проблема с множественными запросами к базе данных: у меня есть запрос для каждого элемента списка и запрос для каждой строки. Итак, имея 100 элементов, я получаю 100 ^ 2 запросов. Я решил проблему с запросами для каждой строки с выбором набора запросов кеширования для ModelChoiceField или ModelMultipleChoiceField в форме Django. Но у меня все еще проблема с методом str. Я пробовал следующее:
1) добавление prefetch_based в ComingAdmin:
def get_queryset(self, request): верните супер(ComingAdmin, self).get_queryset(запрос). \ prefetch_related('products__product') 2) добавление select_based в ComingProductInline:
def get_queryset(self, request): return super(ComingProductsInline, self).get_queryset(request). \ select_based('цена_продукт__продукт') 3) Определение пользовательской формы для встроенных и добавление select_related в набор запросов полей:
Класс
ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): модель = ComingProducts форма = ComingProductsAdminForm класс ComingProductsAdminForm(ModelForm): def __init__(self, *args, **kwargs): super(ComingProductsAdminForm, self).__init__(args, kwargs) self.fields['цена_продукта'].queryset = PricedProduct.objects.all(). \ select_related('продукт') класс Мета: модель = ComingProducts поля = '__all__' 4) Определение пользовательского набора форм:
Класс
ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): модель = ComingProducts набор форм = MyInlineFormset класс MyInlineFormset (BaseInlineFormSet): def __init__(self, data=None, files=None, экземпляр=None, save_as_new=False, prefix=None, queryset=None, **kwargs): super(MyInlineFormset, self).__init__(данные, файлы, экземпляр, save_as_new, префикс, набор запросов, **kwargs) self.queryset = ComingProducts.objects.all(). \ prefetch_related('цена_продукт__продукт') 5) Различные комбинации для предыдущих 4 методов
И ничего не помогает: каждый вызов str для PricedProduct заставляет Django выполнять запрос к таблице Product. Все эти методы были упомянуты в stackoverflow, но они относились к ModelAdmin и не помогали с Inline. Чего мне не хватает?
Использование Django 1.8 на Python 3.4.1 с моделями:
класс Продукт(модели.Модель): имя = модели.CharField(max_length=255) # еще несколько полей здесь защита __str__(сам): вернуть свое имя. класс PricedProduct(models.Model): продукт = модели.ForeignKey(Продукт, связанное_имя='цены') # еще несколько полей здесь защита __str__(сам): вернуть ул (self.product) класс Coming(models.Model): # здесь несколько неважных полей класс ComingProducts(models.Model): ближайшие = модели.ForeignKey(Приближается) Priced_product = models.ForeignKey(PricedProduct) Еще # неважных полей и следующий admin.py:
класс ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): модель = ComingProducts класс ComingAdmin(admin.ModelAdmin): inlines = [ComingProductsInline] Конечно, у меня проблема с множественными запросами к базе данных: у меня есть запрос для каждого элемента списка и запрос для каждой строки. Итак, имея 100 элементов, я получаю 100 ^ 2 запросов. Я решил проблему с запросами для каждой строки с выбором набора запросов кеширования для ModelChoiceField или ModelMultipleChoiceField в форме Django. Но у меня все еще проблема с методом str. Я пробовал следующее:
1) добавление prefetch_based в ComingAdmin:
def get_queryset(self, request): верните супер(ComingAdmin, self).get_queryset(запрос). \ prefetch_related('products__product') 2) добавление select_based в ComingProductInline:
def get_queryset(self, request): return super(ComingProductsInline, self).get_queryset(request). \ select_based('цена_продукт__продукт') 3) Определение пользовательской формы для встроенных и добавление select_related в набор запросов полей:
Класс
ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): модель = ComingProducts форма = ComingProductsAdminForm класс ComingProductsAdminForm(ModelForm): def __init__(self, *args, **kwargs): super(ComingProductsAdminForm, self).__init__(args, kwargs) self.fields['цена_продукта'].queryset = PricedProduct.objects.all(). \ select_related('продукт') класс Мета: модель = ComingProducts поля = '__all__' 4) Определение пользовательского набора форм:
Класс
ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline): модель = ComingProducts набор форм = MyInlineFormset класс MyInlineFormset (BaseInlineFormSet): def __init__(self, data=None, files=None, экземпляр=None, save_as_new=False, prefix=None, queryset=None, **kwargs): super(MyInlineFormset, self).__init__(данные, файлы, экземпляр, save_as_new, префикс, набор запросов, **kwargs) self.queryset = ComingProducts.objects.all(). \ prefetch_related('цена_продукт__продукт') 5) Различные комбинации для предыдущих 4 методов
И ничего не помогает: каждый вызов str для PricedProduct заставляет Django выполнять запрос к таблице Product. Все эти методы были упомянуты в stackoverflow, но они относились к ModelAdmin и не помогали с Inline. Чего мне не хватает?
Мобильная версия