{ "info": { "author": "Chris Chang", "author_email": "c@crccheck.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# Django Object Update\n\n[![Build Status](https://travis-ci.org/crccheck/dj-obj-update.svg?branch=master)](https://travis-ci.org/crccheck/dj-obj-update)\n\n`dj-obj-update` is a module that helps you do two things while updating\nan object:\n\n1. Only do a save if something changed\n2. Log what changed (the logger name is `obj_update` and only outputs\n `logging.DEBUG`)\n\n## Installation\n\n pip install dj-obj-update\n\n## Usage\n\n### Updating an object\n\n from obj_update import obj_update\n\n new_data = {\n 'flavor': 'chocolate',\n }\n for obj in queryset:\n obj_update(obj, new_data)\n\n### Dry run updating an object\n\n from obj_update import obj_update\n\n logger.setLevel(logging.DEBUG) # see \"Logging changes\" below\n\n new_data = {\n 'flavor': 'chocolate',\n }\n for obj in queryset:\n obj_update(obj, new_data, update_fields=[])\n\n### Replacement for [`update_or_create`]\n\n from obj_update import obj_update_or_create\n\n choice, created = obj_update_or_create(\n Choice,\n question=question,\n defaults={'choice_text': 'Flour or corn?'},\n )\n\n[`update_or_create`]: https://docs.djangoproject.com/en/stable/ref/models/querysets/#update-or-create\n\n### Dealing with `auto_now` fields\n\nBy default, `dj-obj-update` constructs an `update_fields` when it saves.\nThis means fields like the primary key, `auto_now`, and `auto_now_add`\nmight not get saved. If you need these, you should set\n`update_fields=None`. Usage is the same as Django's [`update_fields`]\n\n[`update_fields`]: https://docs.djangoproject.com/en/stable/ref/models/instances/#specifying-which-fields-to-save\n\n### Logging changes\n\nUsing `python-json-logger`:\n\n import logging\n from pythonjsonlogger.jsonlogger import JsonFormatter\n\n logger = logging.getLogger('obj_update')\n handler = logging.FileHandler('log/my_obj_changes.log')\n handler.setFormatter(JsonFormatter())\n logger.addHandler(handler)\n logger.setLevel(logging.DEBUG)\n\nWith JSON logging, you'll get messages like:\n\n {\"message\": \"[text hello->hello2]\", \"model\": \"FooModel\", \"pk\": 1, \"changes\": {\"text\": {\"old\": \"hello\", \"new\": \"hello2\"}}}\n\nWith a normal logger, you'll still get output, but it won't have as much\ninformation:\n\n [text hello->hello2]\n\nYou can selectively log object creation or updates. For example, if you don't\nexpect objects to be created, you can only enable the `obj_update.create`\nlogger. Likewise, you can only enable the `obj_update.update` logger to ignore\ncreation. See the `logging.config` example at the top of\n[test_obj_update](./test_obj_update) for an example.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/crccheck/obj_update", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "dj-obj-update", "package_url": "https://pypi.org/project/dj-obj-update/", "platform": "", "project_url": "https://pypi.org/project/dj-obj-update/", "project_urls": { "Homepage": "https://github.com/crccheck/obj_update" }, "release_url": "https://pypi.org/project/dj-obj-update/0.6.0/", "requires_dist": null, "requires_python": ">=3.4", "summary": "`dj-obj-update` helps you update an object but only saves if something changed.", "version": "0.6.0", "yanked": false, "yanked_reason": null }, "last_serial": 7719026, "releases": { "0.0.0": [], "0.1.0": [ { "comment_text": "", "digests": { "md5": "0699d8e4d09996f3c6fda393eccc79e4", "sha256": "dfd33a0ae45c264fa66ce5a8d7f1614673de9c86bdc38a710cfda9912fc320dd" }, "downloads": -1, "filename": "dj_obj_update-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0699d8e4d09996f3c6fda393eccc79e4", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 3650, "upload_time": "2015-05-30T17:41:32", "upload_time_iso_8601": "2015-05-30T17:41:32.012356Z", "url": "https://files.pythonhosted.org/packages/69/a4/e9eef5a116e765a9132e8cd0b5786c34e29bf59d9ccfcc1d475448d73bda/dj_obj_update-0.1.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8926846672bdde15607c7e245f7771f5", "sha256": "708d8eff8beba2e3d14717b85f94168520c436dd020347c06921d2d504ece646" }, "downloads": -1, "filename": "dj-obj-update-0.1.0.tar.gz", "has_sig": false, "md5_digest": "8926846672bdde15607c7e245f7771f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2140, "upload_time": "2015-05-30T17:41:28", "upload_time_iso_8601": "2015-05-30T17:41:28.449575Z", "url": "https://files.pythonhosted.org/packages/ba/10/220775ce3613dc760fb86bf0f357b3abd7a039f3f413c42f99b893aacbcc/dj-obj-update-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "039a97bbfd0547b8b037f4478efeb078", "sha256": "10fbd0165346f7891ab51393fbe9b9052f52753cd691d129c0178f49ffddff5e" }, "downloads": -1, "filename": "dj_obj_update-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "039a97bbfd0547b8b037f4478efeb078", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4429, "upload_time": "2015-06-01T01:12:11", "upload_time_iso_8601": "2015-06-01T01:12:11.094236Z", "url": "https://files.pythonhosted.org/packages/9e/64/aad4ffa940de1ddda9b4f85cc3814d2017e77f186b78123620a30598c5b1/dj_obj_update-0.2.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b28f51276c7bfed5ef0c0df1ae54f9a2", "sha256": "9257f27d20720bf303b57bc08b782245826c1d732e7d885c1949a7001822e250" }, "downloads": -1, "filename": "dj-obj-update-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b28f51276c7bfed5ef0c0df1ae54f9a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2694, "upload_time": "2015-06-01T01:12:08", "upload_time_iso_8601": "2015-06-01T01:12:08.063537Z", "url": "https://files.pythonhosted.org/packages/ee/c4/e199f777a739050459ffcb2a9cb51fc68ba0d34a772cc8407a19d46c4b00/dj-obj-update-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "ee1866dcb543d7b8390b09d0955750be", "sha256": "5a26150b53bed44ec187184655594700dd3019f9fc77d79e81d5fdf8d3020d1d" }, "downloads": -1, "filename": "dj_obj_update-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ee1866dcb543d7b8390b09d0955750be", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4489, "upload_time": "2015-08-02T03:15:56", "upload_time_iso_8601": "2015-08-02T03:15:56.910586Z", "url": "https://files.pythonhosted.org/packages/b9/df/03f1686f5ee748c0aeb4c8b9cac965fd45eeb9c52d4f96b6e6af23422a3f/dj_obj_update-0.2.1-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "cddab8405a4702ce5c525254bc6601a6", "sha256": "e0ba30bcf9e4dbee8bf738444b436ad007452a3cd68d903e1b5fa5df5ab7032e" }, "downloads": -1, "filename": "dj-obj-update-0.2.1.tar.gz", "has_sig": false, "md5_digest": "cddab8405a4702ce5c525254bc6601a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2748, "upload_time": "2015-08-02T03:15:52", "upload_time_iso_8601": "2015-08-02T03:15:52.878669Z", "url": "https://files.pythonhosted.org/packages/ad/8e/b1d8aed75a6dc10d287bb3eba8fb8d098627deeaaf0cbc2733ca2f01d71c/dj-obj-update-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "9f1b102cfaf4422fa42eb87ace1c9608", "sha256": "f5aee1ef9142a477361abe3b228580fdfc25b352279e7a3d55167d7b560d3765" }, "downloads": -1, "filename": "dj_obj_update-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9f1b102cfaf4422fa42eb87ace1c9608", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 4913, "upload_time": "2018-04-19T06:10:31", "upload_time_iso_8601": "2018-04-19T06:10:31.563168Z", "url": "https://files.pythonhosted.org/packages/21/8e/3a45770ee3a8b7589709bdebc6ce344b2e49afa039da366e87828e8a8677/dj_obj_update-0.3.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7d48c5fa25d8e6ef671ee0c584dab34a", "sha256": "fcc20df65259f80f5b3e19e1466fe3fbe30416ee6b16f5c96eb51a39a08ada84" }, "downloads": -1, "filename": "dj-obj-update-0.3.0.tar.gz", "has_sig": false, "md5_digest": "7d48c5fa25d8e6ef671ee0c584dab34a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3088, "upload_time": "2018-04-19T06:10:30", "upload_time_iso_8601": "2018-04-19T06:10:30.197587Z", "url": "https://files.pythonhosted.org/packages/31/f4/1760e5728c1e6c130000358f02b02a374d3b734362cb1bba955fb8e6b0f1/dj-obj-update-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "6b9debaf29dd75cf16aaaa2bb00f3a00", "sha256": "afcbc933bee408d70fe904ca85f834f668a952a98b364c9c2e6cd855cfd2efa2" }, "downloads": -1, "filename": "dj_obj_update-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6b9debaf29dd75cf16aaaa2bb00f3a00", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 3313, "upload_time": "2018-04-19T18:48:01", "upload_time_iso_8601": "2018-04-19T18:48:01.239800Z", "url": "https://files.pythonhosted.org/packages/fd/d7/a09494f977a455a0a8f2d8fe7c8cde49509334c5cd4dab4c0b221368c8e2/dj_obj_update-0.4.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d068bc1416ccbdc1ecdb2bf7e7a16d16", "sha256": "98c23e88fed28b2e0d608c8b5272f4aad3c1c2cddc527315a591198ed3664de7" }, "downloads": -1, "filename": "dj-obj-update-0.4.0.tar.gz", "has_sig": false, "md5_digest": "d068bc1416ccbdc1ecdb2bf7e7a16d16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3178, "upload_time": "2018-04-19T18:47:59", "upload_time_iso_8601": "2018-04-19T18:47:59.541142Z", "url": "https://files.pythonhosted.org/packages/02/08/83c0059708df16b4101024359f46ae23fbc8979036af13d100518f86f9bd/dj-obj-update-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "e3246fd47ecbca0d5890567ae8deb94e", "sha256": "615de810f8d44cce5d9200590481165ff6dea34f73536936f4dc58a7eaed0d77" }, "downloads": -1, "filename": "dj_obj_update-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e3246fd47ecbca0d5890567ae8deb94e", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 3677, "upload_time": "2019-02-28T17:26:52", "upload_time_iso_8601": "2019-02-28T17:26:52.382454Z", "url": "https://files.pythonhosted.org/packages/b3/ea/4f9706eaa89aee2731779106363c7a4b6d4d3a250fbeb7f6d08b6b05020d/dj_obj_update-0.5.0-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c50a6491f6f4c8e6e86ce61512d21780", "sha256": "b1cf2e310687886a0af688841f27988f2b2f9dbcb87b6fd4e9a16f121c7d051c" }, "downloads": -1, "filename": "dj_obj_update-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c50a6491f6f4c8e6e86ce61512d21780", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16918, "upload_time": "2019-10-26T02:58:43", "upload_time_iso_8601": "2019-10-26T02:58:43.608648Z", "url": "https://files.pythonhosted.org/packages/8e/0f/44d505ff6a96caf58fa08e48699a6e7a97bbfb6687c006d6a9f7a3c76423/dj_obj_update-0.5.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b6483f864a59fe766e2aa462794936c3", "sha256": "8c9edf10ef813c61536efc48fb65f11771398334d7fdc57a777ca8165561f496" }, "downloads": -1, "filename": "dj-obj-update-0.5.0.tar.gz", "has_sig": false, "md5_digest": "b6483f864a59fe766e2aa462794936c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3530, "upload_time": "2019-02-28T17:26:50", "upload_time_iso_8601": "2019-02-28T17:26:50.824254Z", "url": "https://files.pythonhosted.org/packages/aa/cd/201e7737a1c7d6010ea9ab251ce8a5ca59c979753e0b725dd75ea02fc52f/dj-obj-update-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "1ee2b7ee2fe190129ad927ac3d27aea8", "sha256": "9c4ef486cf8513a702121bbf1e1830db379582ba453a2ef16c58b8234b1c303e" }, "downloads": -1, "filename": "dj_obj_update-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1ee2b7ee2fe190129ad927ac3d27aea8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 16917, "upload_time": "2019-10-26T04:36:55", "upload_time_iso_8601": "2019-10-26T04:36:55.332425Z", "url": "https://files.pythonhosted.org/packages/36/f0/c6aa7b069029332496e6ddcccc76b2db35bf331c28fc51fbeae2f790c128/dj_obj_update-0.5.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "02fb0e15057960d9cbd8caa6d64156c7", "sha256": "ef232d9ed7b5c8c165e19df69d78bd0f162b3d30da4ff8933991ca30a4e54590" }, "downloads": -1, "filename": "dj-obj-update-0.5.1.tar.gz", "has_sig": false, "md5_digest": "02fb0e15057960d9cbd8caa6d64156c7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 10326, "upload_time": "2019-10-26T04:36:56", "upload_time_iso_8601": "2019-10-26T04:36:56.994792Z", "url": "https://files.pythonhosted.org/packages/88/b0/498008d28d2d9bf49d71c7c553857ef76f66581ab24a590498d328545892/dj-obj-update-0.5.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "7e08c3c88d27edc10752cc0021a40180", "sha256": "c9a3cbc3b4bab96b353fd807c20741d2a1e80c97704bcb14b2c6b3f6e87d1081" }, "downloads": -1, "filename": "dj_obj_update-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7e08c3c88d27edc10752cc0021a40180", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 7756, "upload_time": "2020-07-17T02:40:46", "upload_time_iso_8601": "2020-07-17T02:40:46.613256Z", "url": "https://files.pythonhosted.org/packages/b5/85/af2a09e5f368b8f841aa2f414ed8c3ff26bc3775b5d26289b7d17bad05cf/dj_obj_update-0.6.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2d4b05cb5812917d541dc3328ad1dd25", "sha256": "253c7f104006f99d72b5fc2601c54e1791eefb7d1cfbeaee89ebf194df31ff68" }, "downloads": -1, "filename": "dj-obj-update-0.6.0.tar.gz", "has_sig": false, "md5_digest": "2d4b05cb5812917d541dc3328ad1dd25", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 10689, "upload_time": "2020-07-17T02:40:48", "upload_time_iso_8601": "2020-07-17T02:40:48.008974Z", "url": "https://files.pythonhosted.org/packages/5a/42/bbd4add8d1c4091b3fbc3c3af25f4a7577f135d9d48df013ac3e28d40f86/dj-obj-update-0.6.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7e08c3c88d27edc10752cc0021a40180", "sha256": "c9a3cbc3b4bab96b353fd807c20741d2a1e80c97704bcb14b2c6b3f6e87d1081" }, "downloads": -1, "filename": "dj_obj_update-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7e08c3c88d27edc10752cc0021a40180", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 7756, "upload_time": "2020-07-17T02:40:46", "upload_time_iso_8601": "2020-07-17T02:40:46.613256Z", "url": "https://files.pythonhosted.org/packages/b5/85/af2a09e5f368b8f841aa2f414ed8c3ff26bc3775b5d26289b7d17bad05cf/dj_obj_update-0.6.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2d4b05cb5812917d541dc3328ad1dd25", "sha256": "253c7f104006f99d72b5fc2601c54e1791eefb7d1cfbeaee89ebf194df31ff68" }, "downloads": -1, "filename": "dj-obj-update-0.6.0.tar.gz", "has_sig": false, "md5_digest": "2d4b05cb5812917d541dc3328ad1dd25", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 10689, "upload_time": "2020-07-17T02:40:48", "upload_time_iso_8601": "2020-07-17T02:40:48.008974Z", "url": "https://files.pythonhosted.org/packages/5a/42/bbd4add8d1c4091b3fbc3c3af25f4a7577f135d9d48df013ac3e28d40f86/dj-obj-update-0.6.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }