Lets you store instances of Django models as flat files (simplified fixtures). For when you want to store content in a Git repo, but still want to be able to use the normal Django ORM methods and shortcut functions.
It works by loading the data into an in-memory SQLite database on startup, and then serving queries from there. This means it adds a little time to your app’s boot, and slightly more RAM usage, but with the advantage of a much easier time dealing with static files (rather than custom code to load them directly).
It does not persist changes to the models back into files - this is purely for authoring content in a text editor and using it via Django.
Due to Python limitations yamdl currently only works on Python 3.4 and up.
Why not use normal fixtures?
They’re not only a little verbose, but they need to be loaded into a non-memory database (slower) and you need lots of logic to work out if you should update or delete existing entries. They’re still a better solution for anything that has a lot of data or which needs JOINs, though.
Installation
First, install the package:
pip install yamdl
Then, add it to INSTALLED_APPS:
INSTALLED_APPS = [
...
'yamdl',
...
]
Then, add the in-memory database to DATABASES (note that you must have at least Python 3.4 to have a SQlite module that understands shared memory URIs):
DATABASES = {
...
'yamdl': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'file:yamdl-db?mode=memory&cache=shared',
}
}
Then, add a YAMDL_DIRECTORIES setting which defines where your directories of YAML files can be found (it’s a list):
YAMDL_DIRECTORIES = [
os.path.join(PROJECT_DIR, "content"),
]
Finally, add the database router:
DATABASE_ROUTERS = [
"yamdl.router.YamdlRouter",
]
Usage
First, add the __yamdl__ attribute to the models you want to use static content. A model can only be static or dynamic, not both:
class MyModel(models.Model):
...
__yamdl__ = True
Then, start making static files under one of the directories you listed in the YAMDL_DIRECTORIES setting above. Within one of these, make a directory with the format appname.modelname, and then YAML files ending in .yaml:
andrew-site/
content/
speaking.Talk/
2017.yaml
2016.yaml
Within those YAML files, you can define either a list of model instances, like this:
- 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
Or a single model instance at the top level, like this:
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
When you start up Django, as either runserver or in production, it will read the YAML files and load them into an in-memory database and then let you query them using all the standard ORM stuff.
Todo
Here’s a short list of things I’d like to get done before a 1.0:
Maybe replace the __yamdl__ attribute with something nicer.
Support for Python versions before 3.4, either by using a global SQLite :memory: instance with thread locking or by supporting disk databases with a wipe phase.
Include YAML files in the Django auto-reloader so editing them loads changes in development.
Potentially load changes to flat files in production using mtime checking.
Release files for yamdl 0.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yamdl-0.9.tar.gz | 5.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yamdl-0.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.5 kB
Release files / yamdl-0.9.tar.gz
| Download URL | yamdl-0.9.tar.gz |
|---|---|
| Size | 5.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e6e83461d05ca014db28bb70a4319aa2477ed5ca231e0fbe277f00bf444c3054
|
|
BLAKE2b-256 checksum How to use checksums |
a2b08eb3e7b6e887a59dceef28e3b0d5e2c6216ca146b857beb5411473a1c538
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Release files / yamdl-0.9-py3-none-any.whl
| Download URL | yamdl-0.9-py3-none-any.whl |
|---|---|
| Size | 8.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d5c385fb61e9abff55be0af789555ea98c7c4a1b857bd1dcc8925330b5a7c4b
|
|
BLAKE2b-256 checksum How to use checksums |
f338cbdd3b3edfd31481a5c52a578aefd6f5af1f38794bd30aa019bd79972e1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |