{ "info": { "author": "Daniel Miller", "author_email": "millerdev@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# Common Table Expressions (CTE) for Django\n\n[![Build Status](https://travis-ci.org/dimagi/django-cte.png)](https://travis-ci.org/dimagi/django-cte)\n[![PyPI version](https://badge.fury.io/py/django-cte.svg)](https://badge.fury.io/py/django-cte)\n\n## Installation\n```\npip install django-cte\n```\n\n\n## Usage\n\n### Simple Common Table Expressions\n\nSimple CTE queries can be constructed using `With`. A custom `CTEManager` is\nused to add the CTE to the final query.\n\n```py\nfrom django_cte import CTEManager, With\n\nclass Order(Model):\n objects = CTEManager()\n id = AutoField(primary_key=True)\n region = ForeignKey(\"Region\", on_delete=CASCADE)\n amount = IntegerField(default=0)\n\n\ncte = With(\n Order.objects\n .values(\"region_id\")\n .annotate(total=Sum(\"amount\"))\n)\n\norders = (\n cte.join(Order, region=cte.col.region_id)\n .with_cte(cte)\n .annotate(region_total=cte.col.total)\n .order_by(\"amount\")\n)\n```\n\nOrders returned by this query will have a `region_total` attribute containing\nthe sum of all order amounts in the order's region.\n\n\n### Recursive Common Table Expressions\n\nRecursive CTE queries can be constructed using `With.recursive`.\n\n```py\nclass Region(Model):\n objects = CTEManager()\n name = TextField(primary_key=True)\n parent = ForeignKey(\"self\", null=True, on_delete=CASCADE)\n\ndef make_regions_cte(cte):\n return Region.objects.filter(\n # start with root nodes\n parent__isnull=True\n ).values(\n \"name\",\n path=F(\"name\"),\n depth=Value(0, output_field=IntegerField()),\n ).union(\n # recursive union: get descendants\n cte.join(Region, parent=cte.col.name).values(\n \"name\",\n path=Concat(\n cte.col.path, Value(\"\\x01\"), F(\"name\"),\n output_field=TextField(),\n ),\n depth=cte.col.depth + Value(1, output_field=IntegerField()),\n ),\n all=True,\n )\n\ncte = With.recursive(make_regions_cte)\n\nregions = (\n cte.join(Region, name=cte.col.name)\n .with_cte(cte)\n .annotate(\n path=cte.col.path,\n depth=cte.col.depth,\n )\n .order_by(\"path\")\n)\n```\n\nRegions returned by this query will have `path` and `depth` attributes. The\nresults will be ordered by `path` (hierarchically by region name). In this case\n`path` is a `'\\x01'`-delimited string of region names starting with the root\nregion.\n\nSee [tests](./tests) for more advanced examples.\n\n\n## Running tests\n\n```\ncd django-cte\nmkvirtualenv cte # or however you choose to setup your environment\npip install django nose flake8\n\nnosetests\nflake8 --config=setup.cfg\n```\n\n## Uploading to PyPI\n\nPackage and upload the generated files.\n\n```\npip install -r pkg-requires.txt\n\npython setup.py sdist bdist_wheel\ntwine upload dist/*\n```\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/dimagi/django-cte", "keywords": "", "license": "BSD License", "maintainer": "", "maintainer_email": "", "name": "django-cte", "package_url": "https://pypi.org/project/django-cte/", "platform": "", "project_url": "https://pypi.org/project/django-cte/", "project_urls": { "Homepage": "https://github.com/dimagi/django-cte" }, "release_url": "https://pypi.org/project/django-cte/1.1.4/", "requires_dist": null, "requires_python": "", "summary": "Common Table Expressions (CTE) for Django", "version": "1.1.4" }, "last_serial": 4121412, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "1442a9078784d98857cae9c9a419b267", "sha256": "eaf0ec4be3a507231e01d836836798bf65008b05ae21a607c41b55ecd87af78f" }, "downloads": -1, "filename": "django_cte-0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1442a9078784d98857cae9c9a419b267", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9295, "upload_time": "2018-02-21T15:08:33", "url": "https://files.pythonhosted.org/packages/be/97/72872baa4afe40ae840669c2901a48fb3b38d3d05d672c43d5911aae95da/django_cte-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9815a56532900a6894dcdfb6ae36383c", "sha256": "74f20b2a43d8fbda023b457f62433b7cdbc2433c85723f742fb8a7255585dc85" }, "downloads": -1, "filename": "django-cte-0.1.tar.gz", "has_sig": false, "md5_digest": "9815a56532900a6894dcdfb6ae36383c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6514, "upload_time": "2018-02-21T15:08:34", "url": "https://files.pythonhosted.org/packages/2b/f1/19206c308a0bda98494f0b464d00a1d143123f1848adf66cb84542e59172/django-cte-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "5d1d44881e50c878c4a15f48217ed9a0", "sha256": "f42502060dd2782f72944cd438eefcc417a659c7e83b23dfa5bd0878a5293896" }, "downloads": -1, "filename": "django_cte-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5d1d44881e50c878c4a15f48217ed9a0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9717, "upload_time": "2018-02-21T15:44:48", "url": "https://files.pythonhosted.org/packages/f2/40/d00e70d27cd334b152830d7798dfcf0bbbe921d88bad3e1221a0bbc5fb99/django_cte-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fce95eb3f31c451c519e0dae4334639c", "sha256": "141fbe6126a0340035d5998d81141da8b184f419d336cb3b8030071020ec9bd8" }, "downloads": -1, "filename": "django-cte-0.1.1.tar.gz", "has_sig": false, "md5_digest": "fce95eb3f31c451c519e0dae4334639c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6936, "upload_time": "2018-02-21T15:44:50", "url": "https://files.pythonhosted.org/packages/52/c5/0e2066910938bd024f0177a005c00d6e52ee43939b77546743c79a8cb1cc/django-cte-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "e438878e695d5f50aaff92c31ab48c82", "sha256": "5d4e9589b674c17add92f4f5495e1dfc02797bd51d91ed27e1794701884babd0" }, "downloads": -1, "filename": "django_cte-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e438878e695d5f50aaff92c31ab48c82", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9775, "upload_time": "2018-02-27T19:28:56", "url": "https://files.pythonhosted.org/packages/4a/2a/bc6f7cc624dad18a6a075a6678e00aede7430d0233000d7ac444608732e1/django_cte-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2698c025e6573146e3f3e869fc1dcc6", "sha256": "ce6bfc71c1f63a0b4b604ade1d99606e0a4495e74734b70928960d1e95238f45" }, "downloads": -1, "filename": "django-cte-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b2698c025e6573146e3f3e869fc1dcc6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6932, "upload_time": "2018-02-27T19:28:57", "url": "https://files.pythonhosted.org/packages/f2/33/9fac4f45c8be96dc658fc3690fb9d176e9e462c9f7a8689044bed4496fa0/django-cte-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "d22ad28fbffffeeabd4a77fef7df8c77", "sha256": "25d7c9a149e8baed88c5d6ba0f881c3535a1166a1dae70255b4e27a30d67d8b5" }, "downloads": -1, "filename": "django_cte-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d22ad28fbffffeeabd4a77fef7df8c77", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10317, "upload_time": "2018-03-15T16:11:44", "url": "https://files.pythonhosted.org/packages/07/3c/da176ff57e62fd2d9aa68617ed07a5f43af8a878b31c0729e4ca08d8f9ef/django_cte-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9c0130e36125b6f0de6b199f2f3bcedd", "sha256": "afe731b629d137a0bbb258ab5ee1167adb9a5f2a1f93ff51725a32e7621a8e05" }, "downloads": -1, "filename": "django-cte-0.1.3.tar.gz", "has_sig": false, "md5_digest": "9c0130e36125b6f0de6b199f2f3bcedd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7246, "upload_time": "2018-03-15T16:11:45", "url": "https://files.pythonhosted.org/packages/6b/8d/2f5ac135801d8f9b97dc0f1fd6dd03318a6339b5570b56b330db1f811f4f/django-cte-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "f9480d18f05d2f23807f60af82790f75", "sha256": "4a0a8233048259257965344f989fb4d8694c1e1d2a8cedeab7468d9a312b71ee" }, "downloads": -1, "filename": "django_cte-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f9480d18f05d2f23807f60af82790f75", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10386, "upload_time": "2018-03-21T19:54:55", "url": "https://files.pythonhosted.org/packages/6c/c0/191d46e2ae43d6f9cb9226c9abf4c5e7a6c6654415ac795d0dfe3a15ae50/django_cte-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2216b8e7c0d1a3938346552d3570d8e9", "sha256": "b69837a3afa2c3455f6c3fb5b473f4655229e4c03e7cfe062bfac7a63debe9c1" }, "downloads": -1, "filename": "django-cte-0.1.4.tar.gz", "has_sig": false, "md5_digest": "2216b8e7c0d1a3938346552d3570d8e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7312, "upload_time": "2018-03-21T19:54:56", "url": "https://files.pythonhosted.org/packages/ee/6b/954fdf0a4d351c43ce1b600e6f4794af0d2a69f5cbe047eb105b1d455cae/django-cte-0.1.4.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "5fa1f812ee9491964972a508bd48be0b", "sha256": "a76cacb2698cef0d40260614edd1c996ddbb8c9636df9bc9edb912fe4caa1f5a" }, "downloads": -1, "filename": "django_cte-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5fa1f812ee9491964972a508bd48be0b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10859, "upload_time": "2018-04-05T02:21:12", "url": "https://files.pythonhosted.org/packages/68/74/d536d3ed903116f4aeb3b29a9f62508b64cb819cc4c35f455dfbf12d72c3/django_cte-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "95360e5e1516af9b80520da1513d6306", "sha256": "d549b0851672ea55d72ad58e5c155ab4df54938752af9988824f2a289d5fd151" }, "downloads": -1, "filename": "django-cte-1.0.0.tar.gz", "has_sig": false, "md5_digest": "95360e5e1516af9b80520da1513d6306", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7552, "upload_time": "2018-04-05T02:21:12", "url": "https://files.pythonhosted.org/packages/cc/49/5865250bd196e930db0cae77b8c3511fb7f802a6edeb99794ec1fce63c40/django-cte-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "11135da6246a4e10b5e6fa3caad3f274", "sha256": "09867c497f1595aaf3532c3b76d9b1d8130e24fc0633889884538c5ab499b9c2" }, "downloads": -1, "filename": "django_cte-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "11135da6246a4e10b5e6fa3caad3f274", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10836, "upload_time": "2018-04-09T16:28:54", "url": "https://files.pythonhosted.org/packages/d6/b0/7827e7e6b3baa2c6a58c95c472b7b1c547feb2f936288adb6660d7094707/django_cte-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd72699d3b54d8e1c5fa5002031b7ed1", "sha256": "081293a5e2830903a21cd684e86a8c48a76613421eecff8d26f7e92775946e96" }, "downloads": -1, "filename": "django-cte-1.1.0.tar.gz", "has_sig": false, "md5_digest": "cd72699d3b54d8e1c5fa5002031b7ed1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7534, "upload_time": "2018-04-09T16:28:55", "url": "https://files.pythonhosted.org/packages/f9/f7/08212e2f2d9cf8a572a0fcee63c6a9274fcc7927161438c40813ff47fb14/django-cte-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "70ab537e8bc30038d4df6bc01d6f3548", "sha256": "fec66132c550b5bf847b076857c981ffac2578776824be0e300c3d4c14ccdbbe" }, "downloads": -1, "filename": "django_cte-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "70ab537e8bc30038d4df6bc01d6f3548", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10868, "upload_time": "2018-04-13T18:15:18", "url": "https://files.pythonhosted.org/packages/63/2c/313e2d91c6b5984ddb0aff6a42faeea4df0c979fee94830682e45de6ee45/django_cte-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ee6c03dcb9f0e55d9958829a30848b4", "sha256": "be1d1db1ad079ddf9667f9e8ac1d6755dc8f50cb153a25ef724ff790b04af6ad" }, "downloads": -1, "filename": "django-cte-1.1.1.tar.gz", "has_sig": false, "md5_digest": "3ee6c03dcb9f0e55d9958829a30848b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7561, "upload_time": "2018-04-13T18:15:19", "url": "https://files.pythonhosted.org/packages/c8/0b/6925544e7e4cd0a59f51e548ef2dbda678203f8f128b3e23908985a14d82/django-cte-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "2c4d1d50ee61866e599f3530d7d14fc8", "sha256": "f83f1cb7c9ee78341195cca1fbcd2a870f622812938662a598de1c1a72a43317" }, "downloads": -1, "filename": "django_cte-1.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2c4d1d50ee61866e599f3530d7d14fc8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8728, "upload_time": "2018-05-22T20:56:47", "url": "https://files.pythonhosted.org/packages/c6/5a/4dfe98064e25f6b478c8e344e2e89b49755c4bcb9670a3e81fd8bc6d44e7/django_cte-1.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "64160c4e4cbb30a52fc88815fe65d548", "sha256": "bc9e8e4f3c0e8af8a0721f6cebeb0e1d62b4fe71ebde6257378f18681dd506ae" }, "downloads": -1, "filename": "django-cte-1.1.2.tar.gz", "has_sig": false, "md5_digest": "64160c4e4cbb30a52fc88815fe65d548", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7383, "upload_time": "2018-05-22T20:56:48", "url": "https://files.pythonhosted.org/packages/68/f7/c1cda8d0d8bb9161b1d0d76a7159242953dcc09be521364bc4af0759e51e/django-cte-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "ebae57a458905fdd8176011c6363630b", "sha256": "806a586bd021951202e2cdf5df9700236ba0cac853094c36d7b8df8b2a81a2bd" }, "downloads": -1, "filename": "django_cte-1.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ebae57a458905fdd8176011c6363630b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8759, "upload_time": "2018-06-19T14:39:35", "url": "https://files.pythonhosted.org/packages/44/1f/43211036f969fc092fc068b22eb54f5dcb9a5d437869fbdbdf3c1f6f6509/django_cte-1.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f82df3b3703e3b42b796fc68efd35451", "sha256": "48cb7d558aeddb9e4b9c823229c88b9a0bce72e83f405487063bc41a359eb9f5" }, "downloads": -1, "filename": "django-cte-1.1.3.tar.gz", "has_sig": false, "md5_digest": "f82df3b3703e3b42b796fc68efd35451", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7362, "upload_time": "2018-06-19T14:39:35", "url": "https://files.pythonhosted.org/packages/ac/ed/55be9655329d0d50d388a75bcd23fbabda4d0f533f3e3454c0175eb4fa14/django-cte-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "56c179ac7add71018430ab20bf768beb", "sha256": "54e32f19162c58d8e7c8919d7243e5a536ca7dd62bae245219a769008df5d458" }, "downloads": -1, "filename": "django_cte-1.1.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "56c179ac7add71018430ab20bf768beb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9775, "upload_time": "2018-07-31T18:08:26", "url": "https://files.pythonhosted.org/packages/ec/04/c0d013873d51424826c9f7ce45ba8666d36575336ec8f330561390940c36/django_cte-1.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "377cf5ed6cabea4e19ec4303b56b87bb", "sha256": "be29d81c6104138c19da7b994724a76e5436b9f36d1c880b3f0c5bf2d2e1b94a" }, "downloads": -1, "filename": "django-cte-1.1.4.tar.gz", "has_sig": false, "md5_digest": "377cf5ed6cabea4e19ec4303b56b87bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8008, "upload_time": "2018-07-30T17:47:13", "url": "https://files.pythonhosted.org/packages/d8/b3/645c22dffdcc512b8939b0a244a0118bc71f0e3b6aa7fc365b3893e24bcf/django-cte-1.1.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "56c179ac7add71018430ab20bf768beb", "sha256": "54e32f19162c58d8e7c8919d7243e5a536ca7dd62bae245219a769008df5d458" }, "downloads": -1, "filename": "django_cte-1.1.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "56c179ac7add71018430ab20bf768beb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9775, "upload_time": "2018-07-31T18:08:26", "url": "https://files.pythonhosted.org/packages/ec/04/c0d013873d51424826c9f7ce45ba8666d36575336ec8f330561390940c36/django_cte-1.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "377cf5ed6cabea4e19ec4303b56b87bb", "sha256": "be29d81c6104138c19da7b994724a76e5436b9f36d1c880b3f0c5bf2d2e1b94a" }, "downloads": -1, "filename": "django-cte-1.1.4.tar.gz", "has_sig": false, "md5_digest": "377cf5ed6cabea4e19ec4303b56b87bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8008, "upload_time": "2018-07-30T17:47:13", "url": "https://files.pythonhosted.org/packages/d8/b3/645c22dffdcc512b8939b0a244a0118bc71f0e3b6aa7fc365b3893e24bcf/django-cte-1.1.4.tar.gz" } ] }