【问题标题】:Select join (select xxx) in django?在django中选择加入(选择xxx)?
【发布时间】:2011-12-31 09:09:40
【问题描述】:

我想使用 Django ORM 来编写这个 SQL 请求:

SELECT * FROM versionning t1 
  JOIN (
      SELECT MAX( version ) AS version, name FROM versionning
      WHERE updated < '2011-11-15'
      GROUP BY name
       ) t2 
  ON t1.version = t2.version AND t1.name = t2.name

SQL 表“版本控制”在哪里:

CREATE TABLE IF NOT EXISTS `versionning` (
  `uuid` varchar(36) NOT NULL,
  `name` varchar(40) NOT NULL,
  `version` int(11) NOT NULL,
  `updated` datetime NOT NULL,
  `data` varchar(80) NOT NULL,
  PRIMARY KEY (`uuid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

目标是对对象进行版本控制。就我而言,我希望能够拥有多个具有相同名称但具有不同版本号的对象。然后我想选择'2011-11-15'上所有对象的最新版本。

如何使用 Django ORM 做到这一点?

【问题讨论】:

标签: mysql django


【解决方案1】:

Django 支持原始 SQL 查询 (https://docs.djangoproject.com/en/dev/topics/db/sql/#performing-raw-sql-queries),因此您可以编写如下内容:

Versioning.objects.raw('SELECT * FROM versioning ...')

【讨论】:

  • 是的,但是通过这种方式,我失去了 django ORM 功能(我也想使用过滤,所以原始函数不是解决方案......)
【解决方案2】:

使用Django-Reversion 是您既定目标的一个很好的解决方案。

来自链接:

django-reversion 是 Django Web 框架的扩展, 提供全面的版本控制工具。

特点

  • 回滚到模型历史中的任何点 - 无限撤消 设施!
  • 恢复已删除的模型 - 不再丢失数据!
  • 管理集成以实现最大可用性。
  • 组相关更改为 可以在单个事务中回滚的修订。
  • 每当您的模型更改时自动保存新版本 Django 灵活的信令框架。
  • 自动化您的修订 通过易于使用的中间件进行管理。

django-reversion 可以很容易 以最少的代码添加到您现有的 Django 项目中 变化。

【讨论】:

  • 不幸的是,django-reversion 无法像我的 SQL 请求那样进行选择:您必须为正在显示的每个对象发出请求。
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2022-09-29
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多