Django 从原始查询创建管理列表

2024-01-09

我愿意在管理员中创建查询集列表模板

查询集是通过cursor.execute() 获得的,因此可能需要一个假模型。

基本上我只是想利用 Django admin list 提供的分页和过滤功能。

这是我的代码的相关部分

模型.py

class Query(object):

   def __init__(self, sql):

       self.sql = sql


   def execute_query(self):

        cursor = connection.cursor()
        start_time = time()

        try:
            cursor.execute(self.sql)
        except DatabaseError as e:
            cursor.close()
            raise e

        return cursor, ((time() - start_time) * 1000)

admin.py

 class QueryAdmin(admin.ModelAdmin):
 ....


admin.site.register(Query, QueryAdmin)

我刚刚实现了这个功能。你需要新的视图RawChangeList延伸ChangeList从 Django 查看:

from django.contrib.admin.views.main import ChangeList
from django.db import connections

class RawChangeList(ChangeList):
    """
    Extended Django ChangeList to be able show data from RawQueryset.
    """
    def get_count(self):
        connection = connections[self.queryset.db]
        with connection.cursor() as c:
            if connection.vendor == 'microsoft':  # CTE in subquery is not working in SQL Server
                c.execute(self.queryset.raw_query)
                c.execute('SELECT @@ROWCOUNT')
            else:
                query = 'SELECT COUNT(*) FROM ({query}) AS sq'
                c.execute(query.format(query=self.queryset.raw_query))

            return c.fetchone()[0]

    def get_queryset_slice(self):
        connection = connections[self.queryset.db]
        if connection.vendor == 'microsoft':
            # SQL Server needs ordered query for slicing
            if hasattr(self.queryset, 'ordered') and self.queryset.ordered:
                query = '{query}'
            else:
                query = '{query} ORDER BY 1'
            query += ' OFFSET {offset} ROWS FETCH NEXT {limit} ROWS ONLY'
        else:
            query = '{query} LIMIT {limit} OFFSET {offset}'

        return self.queryset.model.objects.raw(
            query.format(
                query=self.queryset.raw_query,
                offset=self.page_num * self.list_per_page,
                limit=(self.page_num + 1) * self.list_per_page - self.page_num * self.list_per_page,
            )
        )

    def get_queryset(self, request):
        """
        Overriding to avoid applying filters in ChangeList because RawQueryset has not filter method.
        So any filters has to be applied manually for now.
        """
        qs = self.root_queryset
        if not hasattr(qs, 'count'):
            qs.count = lambda: self.get_count()
        return qs

    def get_results(self, request):
        if self.show_all:
            qs = self.queryset
        else:
            qs = self.get_queryset_slice()

        paginator = self.model_admin.get_paginator(request, self.queryset, self.list_per_page)

        self.result_count = paginator.count
        self.show_full_result_count = False
        self.show_admin_actions = True
        self.full_result_count = 0
        self.result_list = list(qs)
        self.can_show_all = True
        self.multi_page = True
        self.paginator = paginator

然后用这个RawChangeList在管理中:

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):

    def get_changelist(self, request, **kwargs):
        return RawChangeList

    def get_queryset(self, request):
        return MyModel.objects.raw('SELECT * FROM my_app_my_model')

    def get_object(self, request, object_id, from_field=None):
        return MyModel.objects.raw('SELECT * FROM my_app_my_model WHERE id=%s', (object_id, ))[0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 从原始查询创建管理列表 的相关文章

随机推荐

  • Apache Flink 使用 Windows 在写入 Sink 之前引发延迟

    我想知道 Flink 窗口是否可能导致从数据进入管道到写入 Cassandra 中的表之间有 10 分钟的延迟 我最初的意图是将每个事务写入 Cassandra 中的一个表 并在 Web 层使用范围键查询该表 但由于数据量很大 我正在考虑延
  • Flask url_for Javascript 中的 URL

    使用 Flask 时在 Javascript 文件中创建动态 URL 的推荐方法是什么 在 jinja2 模板和 python 视图中url for使用 推荐的方法是什么 js文件 因为它们不被模板引擎解释 基本上想做的是 in comme
  • Bundler 使用错误的 Ruby 版本

    当我尝试启动 Rails 服务器时 出现以下错误 bundle exec rails s Your Ruby version is 2 3 7 but your Gemfile specified gt 2 3 8 我不明白为什么会发生这种
  • 如何将 Knockout 打字文件更新为 TypeScript 2.0 友好?

    我已经开始致力于现代化knockout库的 TypeScript 声明文件由DefinitelyTyped项目 声明文件使用了一些已弃用的技术 因此 在 TypeScript 2 0 应用程序中使用它很不方便 当前声明文件包含一个名为的接口
  • 使用tinyMCE 获取内容?

    我有一个tinyMCE textarea frmbody并且正在使用它的jquery实例
  • 从 constexpr 数组创建可变参数模板

    假设我们有以下类型 template
  • 如何在 phantomjs 中等待元素可见性

    用户点击此链接 span 现在我正在模拟 phantomjs 中的点击 page evaluate function panel click console log SUCCESS phantom exit Phantom 在慢速函数结束执
  • XP 上的 WMI 访问被拒绝

    我们的应用程序使用大量 WMI 调用 当使用来宾帐户连接到本地 WMI 服务器失败并出现 ACCESS DENIED 时 这对于用户帐户及以上帐户可以正常工作 如何以访客帐户访问WMI服务器 我添加了访客帐户以允许使用 WMIMGMT MS
  • C#:字符串作为事件的参数?

    我有一个用于表单的 GUI 线程和另一个用于计算事物的线程 该表单有一个 RichtextBox 我希望工作线程将字符串传递到表单 以便每个字符串都显示在文本框中 每次在工作线程中生成新字符串时 我都会调用一个事件 现在应该显示该字符串 但
  • 如何在 Vue 工作流程( Vanilla Bootstrap )中覆盖 Bootstrap 变量?

    官方推荐的自定义 主题引导程序的方法是使用 sass 覆盖引导程序变量 但我该如何做到这一点 或者更确切地说 如何将这部分流程添加到 Vue webpack 工作流程中 谷歌搜索导致尝试编辑vue config js文件将 scss 加载器
  • 命名捕获对的正则表达式问题

    我有以下值 start 2011 03 10T13 00 00Z end 2011 03 30T13 00 00Z scheme W3C DTF 我使用以下正则表达式去除 开始 和 结束 日期 并将它们分配给自己的命名捕获对 start P
  • 朴素贝叶斯分类器 - 多重决策

    我需要知道朴素贝叶斯分类器是否 可用于生成多个决策 我不能 找到任何有证据支持的例子 多项决定 我是这个领域的新手 所以 我有点 使困惑 实际上我需要开发字符识别软件 在那里我需要确定给定的字符是什么 看来贝叶斯分类器可以用来识别 给定的字
  • Numpy 中形状的 (4,) 和 (4,1) 有什么区别?

    我有两个 ndarrayA and B 其形状为 4 和另一个 4 1 当我想使用计算余弦距离时this http docs scipy org doc scipy reference generated scipy spatial dis
  • 如何在python脚本中多次导入python文件

    是否可以在 python 脚本中多次导入 python 文件 因为我使用 import 命令在函数中运行循环回到我的驱动程序文件 但它只工作一次 谢谢 edit 自己解决了 谢谢 您很可能不应该使用 import 来执行您想要执行的操作 没
  • 可变借用自动更改为不可变?

    看起来u 一个可变的借用 在以下情况下自动变得不可变 let v u Both u and v然后是不可变的借用引用 因此它们都是允许的 use std ascii AsciiExt fn show a str println a a fn
  • 如何帮助反序列化器了解泛型不需要反序列化绑定

    考虑以下代码 use std marker PhantomData use serde Deserialize derive Deserialize pub struct Parent
  • 唯一约束的命名约定

    命名约定很重要 主键和外键都有常用且明显的约定 PK Table and FK Table ReferencedTable 分别 这IX Table Column索引的命名也相当标准 那么 UNIQUE 约束呢 此约束是否有普遍接受的命名约
  • 在 Ruby 中执行 XSL 转换的最佳方法 (XSLT 2.0)

    在 Ruby 中执行 XSL 转换的最佳且最有效的方法是什么 我尝试过Nokogiri 但无论我尝试什么 它总是会导致 compilation error element stylesheet 该样式表在我的 XML 编辑器中完美运行 我在
  • Clojure:“java.lang.IllegalArgumentException:没有为键提供值:”当我更改要求时

    我得到了一个java lang IllegalArgumentException No value supplied for key 在我的 Clojure 代码中 我知道当我尝试解构作为参数传递的映射中的键时会发生这种情况 然而 奇怪的是
  • Django 从原始查询创建管理列表

    我愿意在管理员中创建查询集列表模板 查询集是通过cursor execute 获得的 因此可能需要一个假模型 基本上我只是想利用 Django admin list 提供的分页和过滤功能 这是我的代码的相关部分 模型 py class Qu