如何在Django-Admin的get-queryset中使用原始SQL?

2024-10-03 23:23:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Django-Admin中使用Model.objects.raw(),但最终出现了一个通用的数据库错误:“数据库安装有问题。请确保已创建适当的数据库表,并确保适当的用户可以读取该数据库。“

管理员py

class ChapterAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields':['title','shorthand','description',]})
    ]
    list_display = ('shorthand','title')

    def get_queryset(self, request):
        queryset = super(ChapterAdmin, self).get_queryset(request)
        sql = "SELECT * FROM myapp_chapter"
        queryset = Chapter.objects.raw(sql)
        return queryset

模型.py

^{pr2}$

如果queryset被设置为Chapter.objects.all(),而不是{},那么所有功能都会正常工作,因此我最初假设我的原始SQL是不正确的。{cd5>也可能出现读取错误。但是,在dbshell中运行SELECT * FROM myapp_chapter会正常返回所有内容。如何在Django Admin中使用原始SQL获取queryset?

关于我为什么选择使用原始SQL的上下文,shorthand包含我需要自然排序的数字和字母数字值的混合:

1
10
11
4
5
7A
7B

我在dbshell中使用SELECT * FROM myapp_chapter ORDER BY shorthand*1, shorthand得到想要的结果:

1
4
5
7A
7B
10
11

但是,如果不使用原始SQL,我无法找到实现这个结果的方法。有没有更好的方法不使用原始SQL来实现这一点?


Tags: djangofrompy数据库sqlrawobjectsadmin
1条回答
网友
1楼 · 发布于 2024-10-03 23:23:13

从查询中获取SQL并不是那么难:Getting the SQL from a Django QuerySet 但它很少是正确的解决方案,除了调试之外,我不推荐它。在

更好的解决方案是通过Django ORM使用extra(),或者创建一个额外的列(由于后者可以使用索引,因此加载速度更快):Django QuerySet ordering by expression

相关问题 更多 >