Встроенный администратор Django: select_relatedPython

Программы на 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. Чего мне не хватает?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»