django的平面文件模型实例
yamdl的Python项目详细描述
允许您将django模型的实例存储为平面文件(简化的装置)。 因为当您想在git repo中存储内容,但仍然希望能够 使用普通的Django ORM方法和快捷函数
它的工作原理是在启动时将数据加载到内存中的sqlite数据库中,然后 然后在那里提供查询。这意味着它会给你的应用程序增加一点时间 启动,并稍微使用更多的RAM,但有一个更容易的时间优势 处理静态文件(而不是直接加载它们的自定义代码)。
它不会将对模型的更改持久化回文件中—这纯粹是为了 在文本编辑器中编写内容并通过django使用它。
由于python的限制,yamdl目前只在python 3.4和更高版本上工作。
为什么不使用普通的固定装置?
它们不仅有点冗长,而且需要加载到非内存中 数据库(速度较慢),如果要更新 或删除现有条目。对于任何 有很多数据或者需要连接。
安装
首先,安装软件包:
pip install yamdl
然后,将其添加到INSTALLED_APPS:
INSTALLED_APPS = [ ... 'yamdl', ... ]
然后,将内存中的数据库添加到DATABASES(注意,必须在 至少python 3.4有一个能够理解共享内存uri的sqlite模块:
DATABASES = { ... 'yamdl': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'file:yamdl-db?mode=memory&cache=shared', } }
然后,添加一个YAMDL_DIRECTORIES设置,该设置定义目录的位置 可以找到的yaml文件(它是一个列表):
YAMDL_DIRECTORIES = [ os.path.join(PROJECT_DIR, "content"), ]
最后,添加数据库路由器:
DATABASE_ROUTERS = [ "yamdl.router.YamdlRouter", ]
用法
首先,将__yamdl__属性添加到要使用静态 内容。模型只能是静态的或动态的,不能同时是静态和动态的:
class MyModel(models.Model): ... __yamdl__ = True
然后,在 YAMDL_DIRECTORIES以上设置。在其中一个目录中,用 格式appname.modelname,然后yaml文件以.yaml结尾:
andrew-site/ content/ speaking.Talk/ 2017.yaml 2016.yaml
在这些yaml文件中,您可以定义模型实例的列表,如 这个:
- title: 'Alabama' section: us-states - title: 'Alaska' section: us-states done: 2016-11-18 place_name: Fairbanks - title: 'Arizona' section: us-states done: 2016-05-20 place_name: Flagstaff
或者是顶层的单个模型实例,如下所示:
conference: DjangoCon AU title: Horrors of Distributed Systems when: 2017-08-04 description: Stepping through some of the myriad ways in which systems can fail that programmers don't expect, and how this hostile environment affects the design of distributed systems. city: Melbourne country: AU slides_url: https://speakerdeck.com/andrewgodwin/horrors-of-distributed-systems video_url: https://www.youtube.com/watch?v=jx1Hkxe64Xs
启动django时,无论是runserver还是在生产环境中,它都将读取 yaml文件并将它们加载到内存数据库中,然后让您查询它们 使用所有标准的ORM工具
待办事项
下面是我在1.0之前想做的事情的简短列表:
- 也许用更好的东西替换__yamdl__属性。
- 支持3.4之前的Python版本,可以使用带有线程锁定的全局SQLite:memory:实例,也可以使用擦除阶段支持磁盘数据库
- 在Django自动重载程序中包含YAML文件,以便编辑它们可以加载开发中的更改
- 可能使用mtime检查将更改加载到生产中的平面文件