【问题标题】:How to use raw SQL in Django Admin's get_queryset?如何在 Django Admin 的 get_queryset 中使用原始 SQL?
【发布时间】:2019-05-21 03:52:26
【问题描述】:

我尝试在 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

models.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() 无法返回行,则可能会发生错误。但是,在 dbshell 中运行 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 的情况下实现这一目标?

【问题讨论】:

标签: python sql django sqlite


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多