gpt4 book ai didi

python - 如何在 Django Admin 的 get_queryset 中使用原始 SQL?

转载 作者:行者123 更新时间:2023-12-03 18:04:02 25 4
gpt4 key购买 nike

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

admin.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

class Chapter(models.Model):
title = models.CharField(max_length=200)
description = models.TextField(max_length=800, blank=True, null=True)
shorthand = models.SlugField(max_length=3, unique=True, null=True)

def __str__(self):
return self.shorthand

如果 queryset 设置为 Chapter.objects.all() 而不是 Chapter.objects.raw(sql),一切正常,所以我最初假设我的原始 SQL 不正确。我还了解到,如果 Models.objects.raw() 无法返回行,则会发生错误。但是,在 dbshel​​l 中运行 SELECT * FROM myapp_chapter 会正常返回所有内容。 如何在 Django Admin 中使用原始 SQL 获取查询集?

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

1
10
11
4
5
7A
7B

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

1
4
5
7A
7B
10
11

但是,如果不使用原始 SQL,我找不到实现此结果的方法。 有没有更好的方法可以在不使用原始 SQL 的情况下实现这一点?

最佳答案

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

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

关于python - 如何在 Django Admin 的 get_queryset 中使用原始 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53871831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com