Django Admin内联重复查询 [英] Django Admin Inline duplicated queries

查看:54
本文介绍了Django Admin内联重复查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的管理页面中,我的订单模型具有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.

请注意以下事实:

  1. 所有重复查询共享
  1. ALL duplicated queries share

无滚动光标并保持选择状态

  1. 删除内联会删除所有重复的查询.

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆