透明映射到postgres jsonb的虚拟模型字段
django-janyson的Python项目详细描述
在postgresql的^{tt1}中将其他模型字段存储为json对象$ 字段,并将其作为常规模型字段使用。需要新的 布尔/文本/外键/多对多/等字段?只需添加装饰器 以及模型的字段描述。就这样!别再烦人了 迁徙。
安装
- 使用pip install django-janyson安装包。
- 将janyson添加到INSTALLED_APPS设置。
要求
- python 2或3(使用2.7+和3.3+进行测试
- Django 1.9+带Psycopg2
- 六
示例
fromdjango.dbimportmodelsfromjanyson.decoratorsimportadd_fieldsfromjanyson.fieldsimportJanySONFieldclassTag(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')classItem(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)
>>>fromdemo_app.modelsimportTag,Item>>>Tag.objects.create(name='tag1')>>>Tag.objects.create(name='tag2')>>>item=Item(name='test')>>>item<Item:[Item:test]>>>>item.descAttributeError:'Item'objecthasnoattribute'desc'>>>item.qty0>>>print(item.avail)None>>>item.tagsAttributeError:'Item'objecthasnoattribute'tags'>>>tags=Tag.objects.all()>>>item.desc='description'>>>item.qty=100>>>item.avail=True>>>item.tags=tags>>>item.save()>>>delitem>>>item=Item.objects.get(name='test')>>>item.desc'description'>>>item.qty100>>>item.availTrue>>>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获取其他信息。
文档
很快就来。