【问题标题】:Running n time django_content_type query运行 n 次 django_content_type 查询
【发布时间】:2019-05-18 13:29:48
【问题描述】:

Django 内容类型表查询在管理员用户添加页面中命中 n 次,其他页面工作正常。任何人都可以帮助和帮助解决这个问题,让我知道为什么它会击中 n 次吗? 这是查询

SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE "django_content_type"."id" = 94

也分享截图

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    form = django.contrib.auth.formm.UserChangeForm 添加到您的UserAdmin(admin.ModelAdmin) 类中。

    它添加了这一行:user_permissions.queryset = user_permissions.queryset.select_related('content_type'),它将所有 n 个查询替换为一个查询。

    【讨论】:

      【解决方案2】:

      当您在用户模型中包含 AbstractUser 时会出现问题。 很快:您必须在 django admin 中更改您的更改表单。 首先创建新的更改表单并设置 model = User,其中 User 是从 AbstractUser 子类化的新用户模型:

      class AdminChangeForm(forms.UserChangeForm):
          class Meta:
              model = User
              fields = '__all__'
      

      然后在您的用户管理员中将表单设置为上面的类:

      @admin.register(User)
      class UserAdmin(admin.ModelAdmin):
          list_display = ['id', 'username', 'first_name', 'last_name', 'email', 'is_active', 'last_login', 'date_joined']
          list_filter = ('last_login', 'date_joined', 'is_active')
          form = AdminChangeForm
      

      完整教程: https://testdriven.io/blog/django-custom-user-model/

      【讨论】:

        【解决方案3】:

        我也有同样的问题。在您的 UserAdmin 中添加此功能

        from django.contrib import admin
        from django.contrib.auth.models import Permission
        from foo.models import UserModel # your auth model
        
        @admin.register(UserModel)
        class UserAdmin(admin.ModelAdmin):
           def formfield_for_manytomany(self, db_field, request, **kwargs):
            if db_field.name == 'user_permissions':
                kwargs['queryset'] = Permission.objects.all().select_related('content_type')
            return super(UserAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
        

        以上代码覆盖Permission 查询集以减少select_related 函数的查询

        【讨论】:

        • 你也可以使用 admin.site.register(UserModel, UserAdmin)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        相关资源
        最近更新 更多