gpt4 book ai didi

django - 从 RawQuerySet 返回 QuerySet

转载 作者:行者123 更新时间:2023-12-04 11:39:00 32 4
gpt4 key购买 nike

我试图从原始查询集创建一个查询集,但更改列表总是说 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/

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