django - 从 RawQuerySet 返回 QuerySet

标签 django django-admin

我试图从原始查询集创建一个查询集,但更改列表总是说 Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.这是我的尝试(是一个简单的查询,但它会变得更加复杂,我需要一个原始 SQL 查询):

class MyModelAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = MyModel.objects.raw('SELECT field1, field2 FROM MyTable)
        return qs

有什么方法可以在我的更改 ListView 中显示此原始查询应用 admin.site.register(MyModel, MyModelAdmin)在 admin.py 中?

最佳答案

已经有一段时间了,从那时起版本似乎发生了很大变化,但是您曾经能够简单地将 qs 本身转换为字符串或 qs 中包含的查询属性,它会为您拼写出 sql。

例如sql = str(qs)sql = str(qs.query)
话虽如此,django 会修改表名。可能不是 MyTable您正在寻找,但是 appname_my_table .浏览 django 核心以确切了解命名规范是什么,或者从 model_instance._meta.db_name 获取它。或类似的属性(property)。

更新:好吧,看来我误解了这个问题,您根本不想“打印”查询集来检查它生成的 sql,您需要 ModelAdmin 将 RawQuerySet 而不是常规 QuerySet 传递给它的 ChangeView。

简短回答:不,它不会那样工作。它们是两个非常不同的类。

看起来它们的行为相同,因为您可以迭代它们,并且当您这样做时,结果会包含正确的模型实例。然而,随着时间的推移,它缺少 ModelAdmin 的变更 View 所依赖的大量其他功能。我什至不确定它是否真的有经理。

想到的唯一选择是使用:

  • 使用 Model.objects.extra(...)而不是 Model.objects.raw(...) ,以便它返回正确的 QuerySet。
  • 使用您的数据库软件、Postgres 或 MySQL 创建一个 View ,您有什么。并将其映射到一个简单的 django 模型。
  • 您可以尝试重新创建所有缺失的功能,方法是将 RawQuerySet 包装在一个小的代理类中,该类将所有内容传递给 RawQuerySet 并自己实现缺失的方法。我不记得那些是,可能你需要覆盖 __and____or__ ,至少为它提供一个自定义管理器。我以前做过这件事,而且很有可能,但我保证要做很多工作,特别是如果您希望所有常见的管理魔法都能正常工作,请考虑过滤器规范、搜索、内联关系。预计会伤害您的大脑,或者学会在没有您喜爱的大多数管理员福利的情况下生活。

  • 问题是,使用 raw(...)基本上导致与 django 的 ORM 完全分离,尽管乍一看它让您误以为情况并非如此(主要是因为它的迭代器返回正确的 Model 实例)。当然,您的 ModelAdmin 的 ChangeView 对如何处理它一无所知。

    亲切的问候,

    关于django - 从 RawQuerySet 返回 QuerySet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836036/

    相关文章:

    python - django,显示管理站点上不在模型中的字段

    python - Django 从管理面板发送邮件

    python - 从 Django 管理中删除历史按钮

    python - 如何将 per-env Tox deps 与 Pip 需求文件结合起来?

    python - 添加链接到 django 管理页面

    django - 使用 Django 抽象类创建关系并继承该类会出于某种原因创建两个反向关系

    python - 如何在没有 Django 其余部分的情况下使用 Django 模板?

    python - 如何使用 Django 模型字段定义保持 DRY

    django - django管理员list_filter太长

    python - 数据库错误: no such table: django_template