繁体   English   中英

带有 LIMIT 的自定义 get_queryset 用于 django 管理面板

[英]Custom get_queryset with LIMIT for django admin panel

我会有一个自定义查询来在我的管理 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]我有这个错误:

异常值:一旦获取切片,就无法对查询重新排序。

有什么建议?

Django是调用另一个get_queryset中定义的方法ChangeList调用自定义get_queryset中定义的方法ModelAdmin (见ChangeList的源代码)。

要在 admin 中正确应用限制,请定义您自己的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

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

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

您可以点击此链接, 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

我测试了它并解决了它,希望它可以帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM