{ "info": { "author": "shangxiao", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "# django-db-constraints\n\n## What is this?\n\nAdd database table-level constraints to your Django model's Meta class and have `makemigrations` add the appropriate migration.\n\n```python\nclass Foo(models.Model):\n bar = models.IntegerField()\n baz = models.IntegerField()\n\n class Meta:\n db_constraints = {\n 'bar_equal_baz': 'check (bar = baz)',\n }\n```\n\nThis should generate a migration like so:\n\n```python\nclass Migration(migrations.Migration):\n\n initial = True\n\n dependencies = [\n ]\n\n operations = [\n migrations.CreateModel(\n name='Foo',\n fields=[\n ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n ('bar', models.IntegerField()),\n ('baz', models.IntegerField()),\n ],\n ),\n django_db_constraints.operations.AlterConstraints(\n name='Foo',\n db_constraints={'bar_equal_baz': 'check (bar = baz)'},\n ),\n ]\n```\n\nThe resulting SQL applied:\n\n```sql\nCREATE TABLE \"sample_foo\" (\"id\" serial NOT NULL PRIMARY KEY, \"bar\" integer NOT NULL, \"baz\" integer NOT NULL)\nALTER TABLE \"sample_foo\" ADD CONSTRAINT \"bar_equal_baz\" check (bar = baz)\n```\n\n## Composite foreign keys\n\nIt's possible to support composite foreign keys if you have a unique key on your reference model:\n\n([Why are composite foreign keys useful?](https://github.com/rapilabs/blog/blob/master/articles/same-parent-db-pattern.md))\n\n```python\nclass Bar(models.Model):\n baz = models.IntegerField()\n\n class Meta:\n unique_together = ('id', 'baz')\n\n\nclass Foo(models.Model):\n bar = models.ForeignKey(Bar)\n baz = models.IntegerField()\n\n class Meta:\n db_constraints = {\n 'composite_fk': 'foreign key (bar_id, baz) references sample_bar (id, baz)',\n }\n```\n\nResults in:\n\n```sql\nALTER TABLE \"sample_foo\" ADD CONSTRAINT \"composite_fk\" foreign key (bar_id, baz) references sample_bar (id, baz)\n```\n\n## Migration operation ordering\n\nGiven that nothing will depend on a constraint operation, they're simply added to the end of the list of operations\nfor a migration. This includes operations that drop fields used in a constraint as the database drop will any related\nconstraints as well (at least with PostgreSQL).\n\n## Caveats\n\nIt's possible to end up in a situation where the constraints are declared on the Meta class but do not exist in the database\ndue to a database dropping a constraint implicitly when a field in the constraint is dropped.\n\n## Installation\n\n```\npip install django-db-constraints\n```\n\nin your settings.py:\n\n```python\nINSTALLED_APPS = [\n 'django_db_constraints',\n \u2026\n]\n```\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/rapilabs/django-db-constraints", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-db-constraints", "package_url": "https://pypi.org/project/django-db-constraints/", "platform": "", "project_url": "https://pypi.org/project/django-db-constraints/", "project_urls": { "Homepage": "https://github.com/rapilabs/django-db-constraints" }, "release_url": "https://pypi.org/project/django-db-constraints/0.3.0/", "requires_dist": [ "django" ], "requires_python": "", "summary": "Add database table-level constraints to your Django model's Meta", "version": "0.3.0" }, "last_serial": 3100145, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "6e1e2793d8a06c2c75c43aa262129612", "sha256": "4c98a9fd6b2057dd89a7404510b18ade72c3f6f7c465134cd93e645a6ec76841" }, "downloads": -1, "filename": "django_db_constraints-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6e1e2793d8a06c2c75c43aa262129612", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5846, "upload_time": "2017-08-09T13:04:11", "url": "https://files.pythonhosted.org/packages/58/a4/c4825038e7e320f7140850852c900419f3dafd133f4f780bc9e3aeba9f36/django_db_constraints-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aefa6c2530eee05c938c2b4610e4c7f2", "sha256": "27cbdcd38118e37834600cd0b5b8ec171cdb7ad387d8400eba67d112078a144b" }, "downloads": -1, "filename": "django-db-constraints-0.2.0.tar.gz", "has_sig": false, "md5_digest": "aefa6c2530eee05c938c2b4610e4c7f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3976, "upload_time": "2017-08-09T13:04:14", "url": "https://files.pythonhosted.org/packages/04/75/9ec62fbb94df67ad9a4d7b428f4572739e25447e0fcfc27ef5705cc875e4/django-db-constraints-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "e805670ba6fcbfabbb9ee8036c66e7e1", "sha256": "1113f5a09b9e6811b54136d5f65b7bdf14ce057adc06a0e18447b3414849d744" }, "downloads": -1, "filename": "django_db_constraints-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e805670ba6fcbfabbb9ee8036c66e7e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6372, "upload_time": "2017-08-16T08:56:39", "url": "https://files.pythonhosted.org/packages/d8/fe/f7ce761fd0895c1d99435947ed5077dfbe82348ccaa3fef2c9cc80e6a577/django_db_constraints-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "55cd836630df9a240f5040aead939904", "sha256": "ed93690399ed4240ad7fcd2e314221439bb2bd38b73a70e74b374702747f57c2" }, "downloads": -1, "filename": "django-db-constraints-0.3.0.tar.gz", "has_sig": false, "md5_digest": "55cd836630df9a240f5040aead939904", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4251, "upload_time": "2017-08-16T08:56:40", "url": "https://files.pythonhosted.org/packages/b0/6c/6e82abc837fc654b035266707ff87b8d493041a571d731486e56e1491d91/django-db-constraints-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e805670ba6fcbfabbb9ee8036c66e7e1", "sha256": "1113f5a09b9e6811b54136d5f65b7bdf14ce057adc06a0e18447b3414849d744" }, "downloads": -1, "filename": "django_db_constraints-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e805670ba6fcbfabbb9ee8036c66e7e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6372, "upload_time": "2017-08-16T08:56:39", "url": "https://files.pythonhosted.org/packages/d8/fe/f7ce761fd0895c1d99435947ed5077dfbe82348ccaa3fef2c9cc80e6a577/django_db_constraints-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "55cd836630df9a240f5040aead939904", "sha256": "ed93690399ed4240ad7fcd2e314221439bb2bd38b73a70e74b374702747f57c2" }, "downloads": -1, "filename": "django-db-constraints-0.3.0.tar.gz", "has_sig": false, "md5_digest": "55cd836630df9a240f5040aead939904", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4251, "upload_time": "2017-08-16T08:56:40", "url": "https://files.pythonhosted.org/packages/b0/6c/6e82abc837fc654b035266707ff87b8d493041a571d731486e56e1491d91/django-db-constraints-0.3.0.tar.gz" } ] }