【问题标题】:django models without database没有数据库的django模型
【发布时间】:2012-02-23 20:47:43
【问题描述】:

我知道自动设置是让您在 models.py 中定义的任何模型成为数据库表。

我正在尝试定义不是表格的模型。每次用户搜索某些内容时,它们都需要存储动态数据(我们从 API 获取和配置)。这些数据需要组装,然后当用户完成后,丢弃。

以前我为此使用数据库表。它允许我在任何视图中执行“Trips.objects.all”之类的操作,并将其传递给任何模板,因为它们都来自一个数据源。我听说你不能“保存”模型实例化,然后它不会保存到数据库中,但我需要在多个其他视图中访问这些数据(我已经在一个视图中组装),以操纵它并显示它。 . .如果我不保存我无法访问它,如果我保存,那么它在一个数据库中(这将有多个用户的并发问题)

我真的不想传递字典/列表,如果必须的话,我什至不确定我是如何做到的。

想法?

谢谢!

【问题讨论】:

  • Somebody smart 曾经说过一些关于过早优化的事情......进展如何?您在这里试图解决什么问题并不明显。你可能连一个都没有!我会说使用 Django,因为它本来就喜欢它,如果你有特定的问题,请回到这里。
  • 这个问题有很多优点,并非所有应用程序都使用或需要数据库作为后端,但它们可能需要模型方法。目前尚不清楚如何在 Django 中禁用数据库持久性。

标签: database django view django-models django-templates


【解决方案1】:

另一种选择可能是使用:

class Meta:
    managed = False

防止 Django 创建数据库表。

https://docs.djangoproject.com/en/2.2/ref/models/options/#managed

【讨论】:

  • 发帖人提到他想使用 Django 模型,而不需要表格支持。您在此处链接的 Django 文档特别提到不会执行迁移和删除操作,而所有其他与表相关的操作将继续工作,就好像该表存在一样。
  • 这不准确。带有managed = False 的模型仍将创建表。
  • @zepp.lee 也许您指的是旧版本,但当前文档明确表示“如果 [managed =] False,则不会为此模型执行任何数据库表创建或删除操作。这个如果模型表示现有表或通过其他方式创建的数据库视图,则很有用。” (docs.djangoproject.com/en/3.1/ref/models/options/#managed)。所以模型的功能假设有一个映射到模型的数据库表用于查询等,但它不做任何事情来确保数据库表的存在(即不为你管理它)
【解决方案2】:

对我来说,这听起来就像一个普通的Class

如果你愿意,你可以把它放到models.py 中,只是不要在django.db.models.Model 上继承它。或者你可以把它放在任何你想使用它的范围内的任何python文件中。

也许在请求进来时使用the middleware 来实例化它,并在请求完成时丢弃它。一种访问策略可能是将其附加到请求对象本身,但 ymmv。

【讨论】:

  • 我把这门普通课放在哪里最好? models.py?
  • 使用模型而不是常规类有时可能是有利的,即使用 django-rest-swagger 之类的东西来生成 API 文档时。
  • models.py 是适合这种模型的地方
  • @jakob 在 python 中,您可以将类放在任何 .py 文件中。使用一个类import吧。这就是所有from mymodule import MyClass 声明所做的事情。 Checkout packages
  • 我们正在使用这个选项,在一个名为domain_models.py的模块中收集常规类
【解决方案3】:

与 SQLAlchemy 不同,django 的 ORM 不支持在没有数据库后端的模型上进行查询。

您的选择仅限于使用 SQLite 内存数据库,或使用像 dqms 这样为 django 的 ORM 提供纯内存后端的第三方应用程序。

【讨论】:

    【解决方案4】:

    使用 Django 的cache framework 来存储数据并在视图之间共享。

    【讨论】:

      【解决方案5】:

      尝试使用基于数据库或文件的sessions

      【讨论】:

      • 已经试过了,如果你在会话中存储模型的实例,你可以检索它,但是你不能在模型上使用所有正常的方法。 . .例如 "order_by" 。 . .我想那是因为那些转换为 sql 并且我们不再有数据库了,但仍然。 .也许我正在寻找不存在的东西
      【解决方案6】:

      您需要缓存,它将您的数据存储在内存中,并且将是单独的应用程序。

      使用 Django,您可以使用各种缓存后端,例如 memcache、database-backend、redis 等。 由于您需要一些基本的查询和排序功能,我会推荐Redis。 Redis 具有高性能(不高于 memcache),支持数据结构(string/hash/lists/sets/sorted-set)。

      Redis 不会替换数据库,但很适合用作键值数据库模型,因为 Redis 仅支持对键进行查询,因此您必须准备键才能有效地查询数据。

      For example, user 'john.doe' data is: key1 = val1
      The key would be - john.doe:data:key1
      Now I can query all the data for for this user as - redis.keys("john.doe:data:*")
      

      Redis 命令可在http://redis.io/commands 获得

      Django Redis 缓存后端:https://github.com/sebleier/django-redis-cache/

      【讨论】:

        【解决方案7】:

        我为 MongoDB 或任何其他 nosql 铺床;持久化和删除数据的速度非常快,您可以使用 django-norel(mongodb)。

        http://django-mongodb.org/

        【讨论】:

        • 这与所要求的不同。
        猜你喜欢
        • 2011-11-22
        • 2021-03-14
        • 2021-05-03
        • 2014-08-16
        • 1970-01-01
        • 2010-09-23
        • 2015-06-21
        • 2014-01-08
        • 2019-03-18
        相关资源
        最近更新 更多