Django Admin内联重复查询 [英] Django Admin Inline duplicated queries
问题描述
在我的管理页面中,我的订单模型具有TabItemInline的OrderItem模型
In my Admin page I have Order model with TabularInline of OrderItem model
class OrderItemStackAdmin(admin.TabularInline):
model = OrderItem
extra = 0
fieldsets = (
(_('Product'), {
'fields': ('product', 'variant')
}), (_('Add-Ons'), {
'fields': ('product_add_ons', 'add_ons_note')
}), (_('Price'), {
'fields': ('quantity', 'product_price', 'add_ons_total_price')
}), (_('Discount'), {
'fields': ('discount',)
})
)
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related(
"customer_order",
"product",
"variant"
).prefetch_related('product_add_ons')
三个外键: 1.订单 2.产品 3.Variant
一对多: product_add_ons
在与select_related/prefetch相关的情况下,仅减少了 19个查询,但是,发现了 35个重复/类似查询.
With select_related/prefetch related, only 19 queries reduced, however, 35 duplicate/similar queries are found.
请注意以下事实:
- 所有重复查询共享
- ALL duplicated queries share
无滚动光标并保持选择状态
-
删除内联会删除所有重复的查询.
Removing the inline removes all duplicated queries.
删除任何FK或ManyToMany还可以大大减少重复的查询
Removing any FK or ManyToMany also greatly reduce duplicated queries
删除select_related/prefetch_related将导致
Removing select_related/prefetch_related will result in
70个查询,包括55个相似查询和35个重复查询
有任何想法为什么会发生这种情况?
Any ideas why this is happening?
推荐答案
在多次搜索和多次尝试失败后确定.
Ok after many searches and several fail tries.
我最终设法通过使用模型"表单并将其添加到内联管理中来删除所有重复/类似的查询
class OrderItemForm(forms.ModelForm):
""" OrderItem Model Form """
products_choices = [('', '---------')]
for item in Product.objects.values('pk', 'name', 'arabic_name'):
products_choices.append(
(item['pk'], f"{item['arabic_name']}-{item['name']}"))
product = forms.ChoiceField(required=True,
choices=products_choices)
variants_choices = [('', '---------')]
variants_choices.extend(Variants.objects.values_list('pk', 'name'))
variant = forms.ChoiceField(required=False,
choices=variants_choices)
class OrderItemStackAdmin(admin.TabularInline):
""" Stacked Order Items """
model = OrderItem
form = OrderItemForm
autocomplete_fields = ['product_add_ons']
extra = 0
fieldsets = (
(_('Product'), {
'fields': ('product', 'variant')
}), (_('Add-Ons'), {
'fields': ('product_add_ons', 'add_ons_note')
}), (_('Price'), {
'fields': ('quantity', 'product_price', 'add_ons_total_price')
}), (_('Discount'), {
'fields': ('discount',)
})
)
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.prefetch_related('product_add_ons')
这篇关于Django Admin内联重复查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!