【问题标题】:Custom get_queryset with LIMIT for django admin panel带有 LIMIT 的自定义 get_queryset 用于 django 管理面板
【发布时间】:2015-09-13 21:11:11
【问题描述】:

我希望有一个自定义查询来在我的 django 管理面板中显示元素列表。

所以,我使用这样的代码:

class MyAdmin(admin.ModelAdmin):
....
   def get_queryset(self, request):
        return Post.objects.filter(author_type=AuthorType.USER)

这很好用,但我还需要为此查询集添加一个 LIMIT:

class MyAdmin(admin.ModelAdmin):
....
   def get_queryset(self, request):
        return Post.objects.filter(author_type=AuthorType.USER)[:500]

但是当我添加限制子句[:500] 时出现这个错误:

异常值:获取切片后无法重新排序查询。

有什么建议吗?

【问题讨论】:

    标签: python django django-admin django-queryset django-orm


    【解决方案1】:

    Django 正在调用ChangeList 中定义的另一个get_queryset 方法 调用您在ModelAdmin 中定义的自定义get_queryset 方法之后(参见ChangeList source code)。

    要在管理员中正确应用限制,请定义您自己的ChangeList

    from django.contrib.admin.views.main import ChangeList
    
    class CustomChangeList(ChangeList):
        def get_queryset(self, request):
            queryset = super(CustomChangeList, self).get_queryset(request)
    
            return queryset[:5000]
    

    并从ModelAdmin返回这个类:

    @admin.register(MyModel)
    class MyModelAdmin(admin.ModelAdmin):
        list_display = ['__str__']
    
        def get_changelist(self, request, **kwargs):
            return CustomChangeList
    

    【讨论】:

      【解决方案2】:

      您可以点击此链接,https://stackoverflow.com/a/36476084 @pahaz 的回答更准确。

      首先,您需要创建像 @illagrenan 这样的更改列表

      from django.contrib.admin.views.main import ChangeList
      class CustomChangeList(ChangeList):
          def get_queryset(self, request):
              queryset = super(CustomChangeList, self).get_queryset(request)
      
          return queryset[:5000]
      

      然后让您的模型管理员获取此更改列表,

      class YourModelAdmin(admin.ModelAdmin):
          def get_changelist(self, request, **kwargs):
              return CustomChangeList
      

      我已经测试过了,希望对你有帮助。

      【讨论】:

        【解决方案3】:

        很明显,在你的切片之后某处发生了排序,你应该试试这个:

        def get_queryset(self, request):
            qs = super(MyAdmin, self).queryset(request)
            return qs.filter(author_type=AuthorType.USER)[:500]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-04
          • 2014-02-16
          • 1970-01-01
          • 2011-03-09
          • 2016-08-15
          • 2021-05-07
          • 2021-11-19
          相关资源
          最近更新 更多