我遇到了一些與我的django管理員有關的主要問題。許多重複的查詢基於我有多少內聯。Django Inline for 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,在許多地方像MachineAdmin,ArrangementAdmin,SettingAdmin,ArrangementInline prefetch_related沒有運氣的最後幾天。問題在於選擇/選擇內聯查詢集:每個內聯查詢集對數據庫進行1次查詢以進行「設置」,並對「顯示組」進行1次查詢。如果我有10個內聯,它將有20個查詢。與此同時,MachineAdmin查詢集本身似乎沒有任何影響內聯選擇/選擇查詢集 –
@HBui嗨,索裏我錯誤地解釋了你的問題,我更新了答案。在Django 1.10上測試過。 – makaveli
@makeveli你。是。天才。我發佈了這個問題,希望有人能夠像這樣詳細回答。一切都很完美。我甚至不需要改變任何東西。天才。你真了不起。現在回到最後一個問題:我如何爲您投票或做一些有益於您的幫助?我是新的,所以我不知道那些東西。 –