{ "info": { "author": "Pawel Scierski", "author_email": "escer@protonmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django :: 1.10", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP" ], "description": "django-collectionfield\n======================\n\n.. image:: https://api.travis-ci.org/escer/django-collectionfield.svg?branch=master\n :target: https://travis-ci.org/escer/django-collectionfield\n.. image:: https://img.shields.io/pypi/v/django-collectionfield.svg\n :target: https://pypi.python.org/pypi/django-collectionfield\n.. image:: https://coveralls.io/repos/github/escer/django-collectionfield/badge.svg?branch=master\n :target: https://coveralls.io/github/escer/django-collectionfield?branch=master\n\nA reusable Django model field to store collections.\n\nFeatures\n--------\n\n- highly configurable **model field** (changing collection and item types, sorting, choices, item uniqueness and more)\n- **custom lookups** to simplify queries over collection items\n- **form fields** for working with collections\n- collection **item validators**\n- extended ``get_FIELD_display`` method for model fields with choices\n- works with database backends without native support for multi-value columns (like ArrayField for PostgreSQL)\n\nInstallation\n------------\n\n.. code-block:: python\n\n pip install django-collectionfield\n\n\nUsage\n-----\n\nModel field\n~~~~~~~~~~~\n\nDefine model with field that stores lists of strings:\n\n.. code-block:: python\n\n # models.py\n from django.db import models\n from collectionfield.models import CollectionField\n\n class MyModel(models.Model):\n tags = CollectionField()\n\nPass values to model field:\n\n.. code-block:: python\n\n my_model = MyModel.objects.create(tags=['test', 'values'])\n my_model.values\n ['test', 'values']\n\nMaking queries\n~~~~~~~~~~~~~~\n\nRetrieve model instances with particular value present in the collection:\n\n.. code-block:: python\n\n MyModel.objects.filter(tags__has='test')\n\nRetrieve model instances with *ALL* values present in the collection (ignoring items' order):\n\n.. code-block:: python\n\n MyModel.objects.filter(tags__hasall=['test', 'values'])\n\nRetrieve model instances with *ANY* of values present in the collection:\n\n.. code-block:: python\n\n MyModel.objects.filter(tags__hasany=['test', 'values'])\n\n\nCustomizing collections\n~~~~~~~~~~~~~~~~~~~~~~~\n\nCustom collection and item type:\n\n.. code-block:: python\n\n class IntegerSet(models.Model):\n # This field will provide sets of integers \n # instead of default lists of strings:\n values = CollectionField(collection_type=set, item_type=int)\n\nSorting and uniqueness:\n\n.. code-block:: python\n\n class SortedUniqueTextList(models.Model):\n # Before saving, items will be sorted and duplicates dropped:\n texts = CollectionField(sort=True, unique_items=True)\n\nChoices and collection size limit:\n\n.. code-block:: python\n\n class TaggedModel(models.Model):\n tags = CollectionField(\n # Both choices and max_items limit are checked during model validation.\n choices=(\n ('action', \"Action\"),\n ('comedy', \"Comedy\"),\n ('horror', \"Horror\"),\n # ...\n ),\n max_items=2\n )\n\n``get_FIELD_display`` method can handle multiple choices and provide options to customize the display:\n\n.. code-block:: python\n\n tagged_model = TaggedModel.objects.create(tags=['action', 'horror'])\n tagged_model.get_tags_display()\n \"Action, Horror\"\n\n def li_mapper(value, label):\n return \"
  • {0}
  • \".format(label)\n\n def ul_wrapper(field_display):\n return \"\".format(field_display)\n\n tagged_model.get_tags_display(delimiter='', mapper=li_mapper, wrapper=ul_wrapper)\n ''\n\nDjango built-in validators work with entire field values. ``django-collectionfield`` provide validation of single collection items:\n\n.. code-block:: python\n\n from collectionfield.validators import (\n ItemMinValueValidator, ItemMaxValueValidator\n )\n\n class IntegerList(models.Model):\n values = CollectionField(\n item_type=int,\n # item validators check each item separately:\n validators=[ItemMinValueValidator(1), ItemMaxValueValidator(5)]\n )\n\nForm fields\n~~~~~~~~~~~\n\n``django-collectionfield`` comes with 2 form fields:\n\n.. code-block:: python\n\n from collectionfield.forms import CollectionField, CollectionChoiceField\n\n # ``collectionfield.forms.CollectionField`` converts comma-separated text\n # into collection of values:\n\n class MyForm(forms.Form):\n values = CollectionField()\n\n my_form = MyForm({'values': \"A, B, C\"})\n my_form.is_valid()\n True\n my_form.cleaned_data['values']\n ['A', 'B', 'C']\n\n # ``collectionfield.forms.CollectionChoiceField`` behaves more like \n # regular MultipleChoiceField:\n\n class MyChoiceForm(forms.Form):\n values = CollectionChoiceField(\n choices=(\n ('action', \"Action\"),\n ('comedy', \"Comedy\"),\n ('horror', \"Horror\"),\n # ...\n )\n )\n\n my_choice_form = MyChoiceForm({'values': ['action', 'comedy']})\n my_choice_form.is_valid()\n True\n my_choice_form.cleaned_data['values']\n ['action', 'comedy']\n\nBoth form fields support the same set of parameters as the model field:\n\n.. code-block:: python\n\n from collectionfield.forms import CollectionField\n\n class MyForm(forms.Form):\n values = CollectionField(collection_type=set, item_type=int)\n\n my_form = MyForm({'values': \"1, 2, 1, 3\"})\n my_form.is_valid()\n True\n my_form.cleaned_data['values']\n {1, 2, 3}\n\nRepresentation in database\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCollectionField converts its values into string of up to 1024 characters using the following format:\n\n.. code-block:: python\n\n \"|item1|item2|item3|\"\n\nDefault delimiter ('|') and maximum length can be configured:\n\n.. code-block:: python\n\n class MyModel(models.Model):\n values = CollectionField(delimiter=\"$\", max_length=2000)\n\nRequirements\n------------\n\nPython: 2.7, 3.4, 3.5\n\nDjango: 1.8, 1.9, 1.10\n\n.. TODO: Changes\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/escer/django-collectionfield", "keywords": "django models fields collections", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-collectionfield", "package_url": "https://pypi.org/project/django-collectionfield/", "platform": "", "project_url": "https://pypi.org/project/django-collectionfield/", "project_urls": { "Homepage": "https://github.com/escer/django-collectionfield" }, "release_url": "https://pypi.org/project/django-collectionfield/0.0.4/", "requires_dist": null, "requires_python": "", "summary": "Custom Django model field to store multiple values.", "version": "0.0.4" }, "last_serial": 2391881, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "a41a3caeadc631f79247e1c3ae43197d", "sha256": "abda986359ac11ce11bb6da20cf11c46978f3e135c446c59b5dda1ee162748f2" }, "downloads": -1, "filename": "django_collectionfield-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a41a3caeadc631f79247e1c3ae43197d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18709, "upload_time": "2016-03-29T23:59:36", "url": "https://files.pythonhosted.org/packages/c3/4a/29ac24a78bc77e03f6e03275ffd25e16598f42a5b40be3869214c04ff71a/django_collectionfield-0.0.1-py2.py3-none-any.whl" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "6f1544cadfcd7a9fc95081278903e937", "sha256": "95e93dda72f45e84c6a1b73f9367042b4c08cb286ff8ca9eed63b48bd350aa01" }, "downloads": -1, "filename": "django_collectionfield-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6f1544cadfcd7a9fc95081278903e937", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19546, "upload_time": "2016-04-10T00:09:46", "url": "https://files.pythonhosted.org/packages/e4/da/eeb917a21d67218b9869c00640efce8966d8bc4ef1decdfdd6626c82aaee/django_collectionfield-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b12eb6c7867ec919ebb2015bc61ec49", "sha256": "951641eb5de8aa1ebc48daa635a9f6cea90fe4f51c4419f4ade7390686383056" }, "downloads": -1, "filename": "django-collectionfield-0.0.2.tar.gz", "has_sig": false, "md5_digest": "9b12eb6c7867ec919ebb2015bc61ec49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15259, "upload_time": "2016-04-10T00:09:51", "url": "https://files.pythonhosted.org/packages/3a/22/72ca503efca1e69b32873cb01d6283e70f9c5d955cbc2a00f894750feeda/django-collectionfield-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "6fa7acd47630201be962d37e8446d03b", "sha256": "6e8afe8f7462fc3375cfe540d43ca84556c876af3f022436562cb4d5cfadeccc" }, "downloads": -1, "filename": "django_collectionfield-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6fa7acd47630201be962d37e8446d03b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19831, "upload_time": "2016-05-18T23:45:52", "url": "https://files.pythonhosted.org/packages/9a/00/da809db74c01620dff29fba8ea7f4494c29f7f1924a180a0e11f47487e6a/django_collectionfield-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "625821317982984e96530ba4e7219614", "sha256": "8eba85496c5cf086845a2bf91758657fd47eece5cb3c5f05f120a99fd71f197a" }, "downloads": -1, "filename": "django-collectionfield-0.0.3.tar.gz", "has_sig": false, "md5_digest": "625821317982984e96530ba4e7219614", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15540, "upload_time": "2016-05-18T23:45:58", "url": "https://files.pythonhosted.org/packages/89/c1/8ce6542fbb41c6a09d2cff56ac233cb13a7db61e2806b4c6cb4a1a861ac5/django-collectionfield-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "d150695ea6c43206cc302d3fa43f4677", "sha256": "36de566775cb0b336251bec9d1396cf172916ba5a56e8ee471967201bd8ca56d" }, "downloads": -1, "filename": "django_collectionfield-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d150695ea6c43206cc302d3fa43f4677", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20040, "upload_time": "2016-10-10T21:59:43", "url": "https://files.pythonhosted.org/packages/aa/ed/0e3d4ab0cf3b4997d380fbecc84fccbd07e46172b9b209a8afe4f3d7c18e/django_collectionfield-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d3b4f6bfd671363ec85de4548bd83a54", "sha256": "cd52aeee21736d36e52871e2efa4ca327469a6af29131865f2ef9840113646b1" }, "downloads": -1, "filename": "django-collectionfield-0.0.4.tar.gz", "has_sig": false, "md5_digest": "d3b4f6bfd671363ec85de4548bd83a54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15712, "upload_time": "2016-10-10T21:59:45", "url": "https://files.pythonhosted.org/packages/ae/65/8e3df52774bdac7ace13303301bedcd8480ca7080cb4f2f2f0116ee231ee/django-collectionfield-0.0.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d150695ea6c43206cc302d3fa43f4677", "sha256": "36de566775cb0b336251bec9d1396cf172916ba5a56e8ee471967201bd8ca56d" }, "downloads": -1, "filename": "django_collectionfield-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d150695ea6c43206cc302d3fa43f4677", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20040, "upload_time": "2016-10-10T21:59:43", "url": "https://files.pythonhosted.org/packages/aa/ed/0e3d4ab0cf3b4997d380fbecc84fccbd07e46172b9b209a8afe4f3d7c18e/django_collectionfield-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d3b4f6bfd671363ec85de4548bd83a54", "sha256": "cd52aeee21736d36e52871e2efa4ca327469a6af29131865f2ef9840113646b1" }, "downloads": -1, "filename": "django-collectionfield-0.0.4.tar.gz", "has_sig": false, "md5_digest": "d3b4f6bfd671363ec85de4548bd83a54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15712, "upload_time": "2016-10-10T21:59:45", "url": "https://files.pythonhosted.org/packages/ae/65/8e3df52774bdac7ace13303301bedcd8480ca7080cb4f2f2f0116ee231ee/django-collectionfield-0.0.4.tar.gz" } ] }