{ "info": { "author": "Mike Bryant", "author_email": "mike.bryant@ocado.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "******************\ndjango-closuretree\n******************\n\n\n.. image:: https://travis-ci.org/ocadotechnology/django-closuretree.svg\n :target: https://travis-ci.org/ocadotechnology/django-closuretree\n :alt: Build Status\n.. image:: https://landscape.io/github/ocadotechnology/django-closuretree/master/landscape.svg?style=flat\n :target: https://landscape.io/github/ocadotechnology/django-closuretree/master\n :alt: Code Health Badge\n.. image:: https://readthedocs.org/projects/django-closuretree/badge/?version=latest\n :target: http://django-closuretree.readthedocs.org/en/latest/\n :alt: Documentation Status\n.. image:: https://coveralls.io/repos/ocadotechnology/django-closuretree/badge.svg\n :target: https://coveralls.io/r/ocadotechnology/django-closuretree\n :alt: Test Coverage\n.. image:: https://pypip.in/v/django-closuretree/badge.svg?style=flat\n :target: https://pypi.python.org/pypi/django-closuretree/\n :alt: Version Badge\n.. image:: https://pypip.in/license/django-closuretree/badge.svg?style=flat\n :target: https://pypi.python.org/pypi/django-closuretree/\n :alt: License Badge\n\n\n``django-closuretree`` is an implementation of the `closure tree `_ technique for `Django `_ applications designed to provide efficient querying of `tree-based structures `_ in a relational database. Its goal is to reduce the number of queries required when querying the children or parents of a given object.\n\nGiven the following model:\n\n.. code-block:: python\n\n class Node(models.Model):\n name = models.CharField(max_length=24)\n parent = models.ForeignKey('self', related_name='children')\n\nThe children of each model can be queried with:\n\n.. code-block:: python\n\n Node.objects.get(name='A').children.all()\n\nHowever, for recursive lookups, this results in a large number of queries. Instead, ``django-closuretree`` allows you to extract them all in one go:\n\n.. code-block:: python\n\n from closuretree.models import ClosureModel\n\n class Node(ClosureModel):\n name = models.CharField(max_length=24)\n parent = models.ForeignKey('self', related_name='children', null=True)\n\n a = Node.objects.create(name='A')\n Node.objects.create(name='B', parent=a)\n\n Node.objects.get(name='A').get_descendants()\n\nA single query will obtain all the descendants.\n\n===========\nQuick Start\n===========\n\n* Install ``django-closuretree`` with ``pip install django-closuretree``.\n* Inherit your models from ``closuretree.models.ClosureModel`` instead of ``django.db.models.Model``.\n\nThat's it. You can now use ``get_descendants()`` and ``get_ancestors()`` on a model instance.\n\nIf you're adding this to an existing application that already has data in the database, you'll need to run the ``rebuildtable()`` method of each model before the closure tree will be populated with the existing data:\n\n.. code-block:: python\n\n Node.rebuildtable()\n\n============\nContributing\n============\n\nTo contribute, fork the repo, do your work, and issue a pull request. We ask that contributors adhere to `PEP8 `_ standards, and include full tests for all their code.\n\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/ocadotechnology/django-closuretree/", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-closuretree", "package_url": "https://pypi.org/project/django-closuretree/", "platform": "", "project_url": "https://pypi.org/project/django-closuretree/", "project_urls": { "Homepage": "https://github.com/ocadotechnology/django-closuretree/" }, "release_url": "https://pypi.org/project/django-closuretree/1.2.0/", "requires_dist": [ "django (<1.12,>=1.4)", "django-autoconfig" ], "requires_python": "", "summary": "Efficient tree-based datastructure for Django", "version": "1.2.0" }, "last_serial": 3309799, "releases": { "1.1.10": [ { "comment_text": "", "digests": { "md5": "db03d65eaa72d1450685f2721c4a5198", "sha256": "56d1269c041de8f7a5485581d2eb495b3c0fad93ff1006cc25bd909a6d685cfa" }, "downloads": -1, "filename": "django_closuretree-1.1.10-py2-none-any.whl", "has_sig": false, "md5_digest": "db03d65eaa72d1450685f2721c4a5198", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11817, "upload_time": "2016-12-28T11:35:51", "url": "https://files.pythonhosted.org/packages/ab/68/a969eeb1d3efe7c1bad2e293466db51bf384a6c2334fada217b76b3e093e/django_closuretree-1.1.10-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d249a2b5076c81a17b25e5865396fc94", "sha256": "afe3bb8ee594ce2e260e8fea15372de76c684c80d4e4891d828e019061a3a17c" }, "downloads": -1, "filename": "django-closuretree-1.1.10.tar.gz", "has_sig": false, "md5_digest": "d249a2b5076c81a17b25e5865396fc94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12436, "upload_time": "2016-12-28T11:35:52", "url": "https://files.pythonhosted.org/packages/11/5d/c2f9ba8a26513252b7a04e58c4ccc83852177b506b009a26d2541aaf701a/django-closuretree-1.1.10.tar.gz" } ], "1.1.11": [ { "comment_text": "", "digests": { "md5": "ba3bd5097c85d5dd4f84052347b4c7a9", "sha256": "8040026bb4719edfe1f6218a25a15ca2df08e3085e07526cacee947fa4617e32" }, "downloads": -1, "filename": "django_closuretree-1.1.11-py2-none-any.whl", "has_sig": false, "md5_digest": "ba3bd5097c85d5dd4f84052347b4c7a9", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11891, "upload_time": "2017-09-08T13:21:16", "url": "https://files.pythonhosted.org/packages/49/33/0fcaacd82e204dcf3081fce31d73e2a83dd7507e1963df2965d7c70e7273/django_closuretree-1.1.11-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d8ec79bd7fb7a8d51250f9749887507e", "sha256": "466e1b2ab21da9677eb7d958ced5783b43391bd1b4ab49c3c8862d570a9faf55" }, "downloads": -1, "filename": "django_closuretree-1.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "d8ec79bd7fb7a8d51250f9749887507e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11893, "upload_time": "2017-09-08T13:22:15", "url": "https://files.pythonhosted.org/packages/06/2d/f7a89e75e8a13dc0d787264d4e211230c75059369f636c214e64856e0fc3/django_closuretree-1.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fce237b4ff07079bee8280e837b2d0ef", "sha256": "2b5d6ffc5d9610b59ea609687717cdc3225a40b2f807305251d67486e9ef1f30" }, "downloads": -1, "filename": "django-closuretree-1.1.11.tar.gz", "has_sig": false, "md5_digest": "fce237b4ff07079bee8280e837b2d0ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12465, "upload_time": "2017-09-08T13:21:20", "url": "https://files.pythonhosted.org/packages/7d/10/a9d27b2eada1ac488bda3fc4a7d34ae64b3e5fda7fc0da27ab489b990fa4/django-closuretree-1.1.11.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "f36fa7f6a1763660b2a460b107cfec60", "sha256": "4019d4abfc9b719d7bf7dcaf6da0617361d31e2ef7d5302e936eaf19b0e8b427" }, "downloads": -1, "filename": "django_closuretree-1.1.5-py2-none-any.whl", "has_sig": false, "md5_digest": "f36fa7f6a1763660b2a460b107cfec60", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8710, "upload_time": "2015-01-17T10:13:55", "url": "https://files.pythonhosted.org/packages/bf/bb/b889d7b678b930762c544594afc410b46a449f5823740537a5ccf1658980/django_closuretree-1.1.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8ab11be612902dc1c6ac1015cb41d244", "sha256": "1e7c7559793081b0bd6a9a4021ae4a88e6dda3772a1686995d26070b7c8ff097" }, "downloads": -1, "filename": "django_closuretree-1.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "8ab11be612902dc1c6ac1015cb41d244", "packagetype": "bdist_wheel", "python_version": "3.3", "requires_python": null, "size": 8712, "upload_time": "2015-01-17T10:15:53", "url": "https://files.pythonhosted.org/packages/88/a0/7c784622eb28d9840044714a8226925c5c7a9f04e2b7ac33893845fa0098/django_closuretree-1.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e3be09ccdf5caf0fd82b235befa402cf", "sha256": "7c53c8aa604bf37148c67dc92523e2a64a4725a8f892e262b4670fa2130ec5dc" }, "downloads": -1, "filename": "django-closuretree-1.1.5.tar.gz", "has_sig": false, "md5_digest": "e3be09ccdf5caf0fd82b235befa402cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11163, "upload_time": "2015-01-17T10:13:57", "url": "https://files.pythonhosted.org/packages/6a/03/a25aa0efcfd84205acade9af902ed48890c10c0638f0a3bd7644b9aaac2f/django-closuretree-1.1.5.tar.gz" } ], "1.1.5-git.5.b234fcb": [], "1.1.6": [ { "comment_text": "", "digests": { "md5": "63f664ae4b986f4aba14a2ac84e2d382", "sha256": "9f67f9deeeffc7c17b06be0dea8b79460084c8a283e11f2a30679749bbdc14fa" }, "downloads": -1, "filename": "django_closuretree-1.1.6-py2-none-any.whl", "has_sig": false, "md5_digest": "63f664ae4b986f4aba14a2ac84e2d382", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11098, "upload_time": "2015-01-19T09:13:23", "url": "https://files.pythonhosted.org/packages/34/58/d522281cef61b66e91933f0d3da49b658f4c1b91f3aaedf65229d762f3e3/django_closuretree-1.1.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ee930b8c40186be5f229956d4759d2d", "sha256": "6d02569bc5af43e1afb687d9e51a007351aebc1be1ebeb7df0caa4725bb1c8e2" }, "downloads": -1, "filename": "django_closuretree-1.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "2ee930b8c40186be5f229956d4759d2d", "packagetype": "bdist_wheel", "python_version": "3.3", "requires_python": null, "size": 11095, "upload_time": "2015-01-19T09:14:48", "url": "https://files.pythonhosted.org/packages/07/af/fd6db37b04f2b9a4d4bcf7c4cd2a9dd95b1c392918db5c5a5242541996b1/django_closuretree-1.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a5d4cb7c3105e3eb55d2c588584dd61a", "sha256": "cdd9171dffbb203d1523b8373e7756276081774e7fac3c6673e7511daed26bd6" }, "downloads": -1, "filename": "django-closuretree-1.1.6.tar.gz", "has_sig": false, "md5_digest": "a5d4cb7c3105e3eb55d2c588584dd61a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12756, "upload_time": "2015-01-19T09:13:25", "url": "https://files.pythonhosted.org/packages/97/47/53ac6563157a9a0f5e72cbca6a5162bc049858c3bab48ac86ad64ac6abbe/django-closuretree-1.1.6.tar.gz" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "eef21c762b73495dceea01ec8ed54520", "sha256": "738292f18932947140183e4de3c13875f5306af539bb56d9486c58dd048a392a" }, "downloads": -1, "filename": "django_closuretree-1.1.7-py2-none-any.whl", "has_sig": false, "md5_digest": "eef21c762b73495dceea01ec8ed54520", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11157, "upload_time": "2015-07-02T08:47:26", "url": "https://files.pythonhosted.org/packages/ca/a2/c4fe26e5538587c80582f31919a5722ffe79cc37465f5f9df7ff6a5bb9e6/django_closuretree-1.1.7-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4086ad29766defd4b018eafb9effe59b", "sha256": "11e619a308a8fecd1de7131bef3d2e0708b6c5bdc2f669e11909743017ac0406" }, "downloads": -1, "filename": "django_closuretree-1.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "4086ad29766defd4b018eafb9effe59b", "packagetype": "bdist_wheel", "python_version": "3.2", "requires_python": null, "size": 11155, "upload_time": "2015-07-02T08:47:45", "url": "https://files.pythonhosted.org/packages/0c/50/4a631ecc4e88e8f810f8111bcb074ba1afacc1f51c72cac793ee93b25dee/django_closuretree-1.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ee493e250ce483bd7faa7c426ed0daa", "sha256": "e73f305d937fda68a3952ed407c2bdc7ea0cd331251ccf773c4f4cf317a6363a" }, "downloads": -1, "filename": "django-closuretree-1.1.7.tar.gz", "has_sig": false, "md5_digest": "0ee493e250ce483bd7faa7c426ed0daa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11839, "upload_time": "2015-07-02T08:47:30", "url": "https://files.pythonhosted.org/packages/11/71/deb528d1cd71b9c19289ef324ab35d709c71b752f74d20690f0890607e32/django-closuretree-1.1.7.tar.gz" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "dce090bac486c1c135adac98b80ab7a1", "sha256": "6ffa0d035592f21dc8c8877371186c197b698cecc01a966ac08bea4751177ba9" }, "downloads": -1, "filename": "django_closuretree-1.1.8-py2-none-any.whl", "has_sig": false, "md5_digest": "dce090bac486c1c135adac98b80ab7a1", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11409, "upload_time": "2016-03-30T17:12:52", "url": "https://files.pythonhosted.org/packages/dd/38/d3c3d3f80d4571595c2806ddec8a8988cf17e037308e4315e18d2146075f/django_closuretree-1.1.8-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d6e79f79da7f1754ea4aaba3cbf490b", "sha256": "e0c89a55c4279070f192c2d90dbdc9198f226dfd38ae8e942af3a3747a5d76ff" }, "downloads": -1, "filename": "django_closuretree-1.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "0d6e79f79da7f1754ea4aaba3cbf490b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11411, "upload_time": "2016-03-30T17:12:52", "url": "https://files.pythonhosted.org/packages/be/5a/19faef314178a2863346afd091d228dfd9bf837bfa6cdd2fbe83d9386707/django_closuretree-1.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90c237240fac4ae847da4d9437b1a08b", "sha256": "f5816351d3ef4034939f3ba015fad0227907d741a1a611561d740899f782dac1" }, "downloads": -1, "filename": "django-closuretree-1.1.8.tar.gz", "has_sig": false, "md5_digest": "90c237240fac4ae847da4d9437b1a08b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12065, "upload_time": "2016-03-30T17:13:06", "url": "https://files.pythonhosted.org/packages/35/c0/c6dbaa052b8c12239fb7e74da9f4f2609aa7fd0a2e4be2860342b17884c2/django-closuretree-1.1.8.tar.gz" } ], "1.1.9": [ { "comment_text": "", "digests": { "md5": "7eacc8f3d423adfe666237128792f2ee", "sha256": "7cd4431e72a08a791b46cf570eeab267195f6fb23181691eedc941899cb49056" }, "downloads": -1, "filename": "django_closuretree-1.1.9-py2-none-any.whl", "has_sig": false, "md5_digest": "7eacc8f3d423adfe666237128792f2ee", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11737, "upload_time": "2016-10-11T09:12:21", "url": "https://files.pythonhosted.org/packages/64/76/7bb24ce466d3f61747f1b04a9ea932a5a64226121a0d1e90158d58acc99a/django_closuretree-1.1.9-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5e8ca4375364e3a60cf51dc18c2d222", "sha256": "d3460ef2007a661a5209a2341f88bca726a30a72f15f935ab8c31ee70bfa04ab" }, "downloads": -1, "filename": "django-closuretree-1.1.9.tar.gz", "has_sig": false, "md5_digest": "b5e8ca4375364e3a60cf51dc18c2d222", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12366, "upload_time": "2016-10-11T09:12:23", "url": "https://files.pythonhosted.org/packages/fe/51/44710c0b247d0a3111129b5338260b8225f4f7ca6ff6d4890399781c0ab6/django-closuretree-1.1.9.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "b9543fd70effb0ab7f8b7c4eb0aef0cd", "sha256": "98df2492e513ccd3c8ae6c04f0aa487d2b1adb571622bb8e42aee8ffd33a4f96" }, "downloads": -1, "filename": "django_closuretree-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "b9543fd70effb0ab7f8b7c4eb0aef0cd", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12037, "upload_time": "2017-11-06T15:35:11", "url": "https://files.pythonhosted.org/packages/a3/b1/b6672596799a576a9cef096a41c3c8f22af69e32c984d9d3e91e3d7bf32b/django_closuretree-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9efc71899e5f0e5362cf8f48cd139501", "sha256": "2c95e04838e88e178b8d586986107ffe55fbe76dc06517005664a7061d078caa" }, "downloads": -1, "filename": "django_closuretree-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9efc71899e5f0e5362cf8f48cd139501", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12035, "upload_time": "2017-11-06T15:36:13", "url": "https://files.pythonhosted.org/packages/dd/d7/291593199ef5a502ea8cb02b010cdf8b379fd2e188bd41c1c6a2ba035047/django_closuretree-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a310f64f6b0267d009fe67ae225558fc", "sha256": "570e9e05647790161632f833f82de7c51679333eb6e3cd26a01c1c359dc41221" }, "downloads": -1, "filename": "django-closuretree-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a310f64f6b0267d009fe67ae225558fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12667, "upload_time": "2017-11-06T15:35:13", "url": "https://files.pythonhosted.org/packages/53/22/c674ae07363ac95189da024a5a70167b5841107912117508fc5343c96c79/django-closuretree-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b9543fd70effb0ab7f8b7c4eb0aef0cd", "sha256": "98df2492e513ccd3c8ae6c04f0aa487d2b1adb571622bb8e42aee8ffd33a4f96" }, "downloads": -1, "filename": "django_closuretree-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "b9543fd70effb0ab7f8b7c4eb0aef0cd", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12037, "upload_time": "2017-11-06T15:35:11", "url": "https://files.pythonhosted.org/packages/a3/b1/b6672596799a576a9cef096a41c3c8f22af69e32c984d9d3e91e3d7bf32b/django_closuretree-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9efc71899e5f0e5362cf8f48cd139501", "sha256": "2c95e04838e88e178b8d586986107ffe55fbe76dc06517005664a7061d078caa" }, "downloads": -1, "filename": "django_closuretree-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9efc71899e5f0e5362cf8f48cd139501", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12035, "upload_time": "2017-11-06T15:36:13", "url": "https://files.pythonhosted.org/packages/dd/d7/291593199ef5a502ea8cb02b010cdf8b379fd2e188bd41c1c6a2ba035047/django_closuretree-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a310f64f6b0267d009fe67ae225558fc", "sha256": "570e9e05647790161632f833f82de7c51679333eb6e3cd26a01c1c359dc41221" }, "downloads": -1, "filename": "django-closuretree-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a310f64f6b0267d009fe67ae225558fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12667, "upload_time": "2017-11-06T15:35:13", "url": "https://files.pythonhosted.org/packages/53/22/c674ae07363ac95189da024a5a70167b5841107912117508fc5343c96c79/django-closuretree-1.2.0.tar.gz" } ] }