我试图从原始查询集创建一个查询集,但更改列表总是说 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。 __and__
和 __or__
,至少为它提供一个自定义管理器。我以前做过这件事,而且很有可能,但我保证要做很多工作,特别是如果您希望所有常见的管理魔法都能正常工作,请考虑过滤器规范、搜索、内联关系。预计会伤害您的大脑,或者学会在没有您喜爱的大多数管理员福利的情况下生活。 问题是,使用
raw(...)
基本上导致与 django 的 ORM 完全分离,尽管乍一看它让您误以为情况并非如此(主要是因为它的迭代器返回正确的 Model 实例)。当然,您的 ModelAdmin 的 ChangeView 对如何处理它一无所知。亲切的问候,
关于django - 从 RawQuerySet 返回 QuerySet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836036/