用于存储多个值的自定义django模型字段。

django-collectionfield的Python项目详细描述


https://api.travis-ci.org/escer/django-collectionfield.svg?branch=masterhttps://img.shields.io/pypi/v/django-collectionfield.svghttps://coveralls.io/repos/github/escer/django-collectionfield/badge.svg?branch=master

用于存储集合的可重用django模型字段。

功能

  • 高度可配置model字段(更改集合和项目类型、排序、选项、项目唯一性等)
  • 自定义查找以简化对集合项的查询
  • form字段用于处理集合
  • 集合项验证器
  • 为具有选项的模型字段扩展get_FIELD_display方法
  • 在不支持多值列的情况下使用数据库后端(如用于PostgreSQL的ArrayField)

安装

pipinstalldjango-collectionfield

用法

模型字段

使用存储字符串列表的字段定义模型:

# models.pyfromdjango.dbimportmodelsfromcollectionfield.modelsimportCollectionFieldclassMyModel(models.Model):tags=CollectionField()

将值传递到模型字段:

my_model=MyModel.objects.create(tags=['test','values'])my_model.values['test','values']

查询

检索集合中存在特定值的模型实例:

MyModel.objects.filter(tags__has='test')

检索集合中存在值为all的模型实例(忽略项的顺序):

MyModel.objects.filter(tags__hasall=['test','values'])

使用集合中存在的值any检索模型实例:

MyModel.objects.filter(tags__hasany=['test','values'])

自定义集合

自定义收藏和项目类型:

classIntegerSet(models.Model):# This field will provide sets of integers# instead of default lists of strings:values=CollectionField(collection_type=set,item_type=int)

排序和唯一性:

classSortedUniqueTextList(models.Model):# Before saving, items will be sorted and duplicates dropped:texts=CollectionField(sort=True,unique_items=True)

选项和集合大小限制:

classTaggedModel(models.Model):tags=CollectionField(# Both choices and max_items limit are checked during model validation.choices=(('action',"Action"),('comedy',"Comedy"),('horror',"Horror"),# ...),max_items=2)

get_FIELD_display方法可以处理多个选项并提供自定义显示的选项:

tagged_model=TaggedModel.objects.create(tags=['action','horror'])tagged_model.get_tags_display()"Action, Horror"defli_mapper(value,label):return"<li>{0}</li>".format(label)deful_wrapper(field_display):return"<ul>{0}</ul>".format(field_display)tagged_model.get_tags_display(delimiter='',mapper=li_mapper,wrapper=ul_wrapper)'<ul><li>Action</li><li>Horror</li></ul>'

django内置验证器处理整个字段值。django-collectionfield提供单个集合项的验证:

fromcollectionfield.validatorsimport(ItemMinValueValidator,ItemMaxValueValidator)classIntegerList(models.Model):values=CollectionField(item_type=int,# item validators check each item separately:validators=[ItemMinValueValidator(1),ItemMaxValueValidator(5)])

表单域

django-collectionfield带有两个表单域:

fromcollectionfield.formsimportCollectionField,CollectionChoiceField# ``collectionfield.forms.CollectionField`` converts comma-separated text# into collection of values:classMyForm(forms.Form):values=CollectionField()my_form=MyForm({'values':"A, B, C"})my_form.is_valid()Truemy_form.cleaned_data['values']['A','B','C']# ``collectionfield.forms.CollectionChoiceField`` behaves more like# regular MultipleChoiceField:classMyChoiceForm(forms.Form):values=CollectionChoiceField(choices=(('action',"Action"),('comedy',"Comedy"),('horror',"Horror"),# ...))my_choice_form=MyChoiceForm({'values':['action','comedy']})my_choice_form.is_valid()Truemy_choice_form.cleaned_data['values']['action','comedy']

两个表单字段都支持与模型字段相同的参数集:

fromcollectionfield.formsimportCollectionFieldclassMyForm(forms.Form):values=CollectionField(collection_type=set,item_type=int)my_form=MyForm({'values':"1, 2, 1, 3"})my_form.is_valid()Truemy_form.cleaned_data['values']{1,2,3}

数据库中的表示

collectionfield使用以下格式将其值转换为最多1024个字符的字符串:

"|item1|item2|item3|"

缺省定界符(''')和最大长度可以配置:

classMyModel(models.Model):values=CollectionField(delimiter="$",max_length=2000)

要求

Python:2.7、3.4、3.5

django:1.8、1.9、1.10

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何拆分字符串(基于各种分隔符),但不保留空格?   解析。Json格式的txt文件和knime中的java   java Spring rest api为什么在rest api调用的响应中更改了数据类型   升华文本3抛出java。lang.ClassNotFoundException,而记事本++不存在   java Android指纹扫描仪在尝试5次后停止工作?   java Android如何设置精确的重复报警?   java如何使用HTTPGET connect为access API输入用户名和密码   java当测试报告显示没有测试失败时,Gradle为什么说“有失败的测试”?   用Gson实现java获取响应   MapReduce程序中函数错误的java不可映射参数   java spring安全性不符合自动代理的条件   java GWT使用异步回调进行同步/阻塞调用   java奇怪的类数组问题无法在jsp中显示   如何在java中使用PrinterJob使用epl打印条形码   java如何在JTable中居中单元格   将Java Mockito测试转换为Kotlin   html Java正则表达式模式匹配到多个相同标记   testCompile中缺少java Gradle(Android)多项目依赖项   在输入提示后输入字符串时发生java FileNotFoundException