Я столкнулся с одной важной проблемой с моим администратором django. Множество повторяющихся запросов, основанных на количестве встроенных строк, которые у меня есть.Django Inline для ManyToMany генерирует повторяющиеся запросы
models.py
class Setting(models.Model):
name = models.CharField(max_length=50, unique=True)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
class DisplayedGroup(models.Model):
name = models.CharField(max_length=30, unique=True)
position = models.PositiveSmallIntegerField(default=100)
class Meta:
ordering = ('priority',)
def __str__(self):
return self.name
class Machine(models.Model):
name = models.CharField(max_length=20, unique=True)
settings = models.ManyToManyField(
Setting, through='Arrangement', blank=True
)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
class Arrangement(models.Model):
machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
setting = models.ForeignKey(Setting, on_delete=models.CASCADE)
displayed_group = models.ForeignKey(
DisplayedGroup, on_delete=models.PROTECT,
default=1)
priority = models.PositiveSmallIntegerField(
default=100,
help_text='Smallest number will be displayed first'
)
class Meta:
ordering = ('priority',)
unique_together = (("machine", "setting"),)
admin.py
class ArrangementInline(admin.TabularInline):
model = Arrangement
extra = 1
class MachineAdmin(admin.ModelAdmin):
inlines = (ArrangementInline,)
Если у меня есть 3 настройки добавлены в инлайн форме и 1 дополнительный, у меня есть около 10 Дубликат запросов
SELECT "corps_setting"."id", "corps_setting"."name", "corps_setting"."user_id", "corps_setting"."tagged", "corps_setting"."created", "corps_setting"."modified" FROM "corps_setting" ORDER BY "corps_setting"."name" ASC
- Duplicated 5 times
SELECT "corps_displayedgroup"."id", "corps_displayedgroup"."name", "corps_displayedgroup"."color", "corps_displayedgroup"."priority", "corps_displayedgroup"."created", "corps_displayedgroup"."modified" FROM "corps_displayedgroup" ORDER BY "corps_displayedgroup"."priority" ASC
- Duplicated 5 times.
Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно прямо здесь? Я потратил 3 дня, пытаясь решить проблему самостоятельно без везения.
Проблема ухудшается, когда у меня около 50 настроек встроенных машин, у меня будет ~ 100 запросов.
Я пытался использовать select_related, prefetch_related в многочисленных местах, как MachineAdmin, ArrangementAdmin, SettingAdmin, ArrangementInline без удачи в течение последних нескольких дней. Проблема заключается в наборе запросов Select/Choices inline: с каждым встроенным, он делает 1 запрос к базе данных для «настройки» и 1 запрос для «отображаемой группы». Если у меня 10 строк, у нас будет 20 запросов. Между тем, сам запрос набора MachineAdmin, похоже, не влияет на встроенный запрос выбора/выбора –
@HBui Эй, сорри, я неверно истолковал ваш вопрос, я обновил ответ. Протестировано на Django 1.10. – makaveli
@makeveli Вы. Находятся. Гений. Я разместил этот вопрос, не надеясь, что кто-то сможет ответить в деталях, как это. Все работает отлично. Мне даже не пришлось ничего менять. Genius. Ты великолепен. Теперь на последний вопрос: как я могу проголосовать за вас или сделать что-то полезное для вашей помощи? Я новичок, поэтому я не знаю этого. –