透明映射到Postgres jsonb的虚拟模型字段
项目描述
将额外的模型字段作为JSON对象存储在PostgreSQL的jsonb字段中,并以常规模型字段的方式与它们一起工作。需要新的布尔型/文本/外键/多对多等字段?只需将带有字段描述的装饰器添加到您的模型中。就这样!不再有烦人的迁移了。
安装
使用pip install django-janyson安装软件包。
将janyson添加到INSTALLED_APPS设置。
要求
Python 2或3(已测试2.7+和3.3+)
Django 1.9+与psycopg2
six
示例
from django.db import models
from janyson.decorators import add_fields
from janyson.fields import JanySONField
class Tag(models.Model):
name = models.CharField(max_length=16)
def __str__(self):
return "[Tag: {}]".format(self.name)
extra_fields = {
'desc': {'type': 'str'},
'qty': {'type': 'num', 'default': 0, 'use_default': True},
'avail': {'type': 'nullbool', 'use_default': True},
'main_tag': {'type': 'fk', 'model': Tag},
'tags': {'type': 'm2m', 'model': 'demo_app.Tag'},
}
common_options = {
'use_default': False,
'dir_hide': True,
}
@add_fields(extra_fields, field_options=common_options, janyson_field='extra')
class Item(models.Model):
name = models.CharField(max_length=64)
extra = JanySONField(verbose_name='janyson field', default=dict,
blank=True, null=True)
def __str__(self):
return "[Item: {}]".format(self.name)
>>> from demo_app.models import Tag, Item
>>> Tag.objects.create(name='tag1')
>>> Tag.objects.create(name='tag2')
>>> item = Item(name='test')
>>> item
<Item: [Item: test]>
>>> item.desc
AttributeError: 'Item' object has no attribute 'desc'
>>> item.qty
0
>>> print(item.avail)
None
>>> item.tags
AttributeError: 'Item' object has no attribute 'tags'
>>> tags = Tag.objects.all()
>>> item.desc = 'description'
>>> item.qty = 100
>>> item.avail = True
>>> item.tags = tags
>>> item.save()
>>> del item
>>> item = Item.objects.get(name='test')
>>> item.desc
'description'
>>> item.qty
100
>>> item.avail
True
>>> item.tags
[<Tag: [Tag: tag1]>, <Tag: [Tag: tag1]>, <Tag: [Tag: tag2]>]
测试
python runtests.py [-d TESTDBNAME] [-h HOSTNAME] [-p PORT] [-U USERNAME] [-P PASSWORD]
运行python runtests.py --help以获取更多信息。
文档
即将推出。