{ "info": { "author": "Martin Chase", "author_email": "outofculture@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "Django Cached Field\n===================\n\nIntroduction\n------------\n\nUsing Django ORM and Celery, cache expensive-to-calculate attributes.\n\nExample\n-------\n\nSay you have a CTO who believes everything belongs in a relational database and\na slow method on one of your models::\n\n class Lamppost(models.Model):\n # ...\n @property\n def slow_full_name(self):\n ackermann(5, 2)\n return 'The %s %s of %s' % (self.weight, self.first_name, self.country)\n\nUgh; too slow. Let's cache that (but not with, say, a dedicated\ncaching system). We'll want a few tools. `Celery\n` with `django-celery\n` will need to be set up and\nhumming along smoothly. Then we'll add in our cached field and rename\nour method appropriately::\n\n from django_cached_field import CachedIntegerField\n\n class Lamppost(models.Model):\n # ...\n slow_full_name = CachedTextField(null=True)\n\n def calculate_slow_full_name(self):\n ackermann(5, 2)\n return 'The %s %s of %s' % (self.weight, self.first_name, self.country)\n\n(Yeah, ``calculate_*`` is just a convention. I clearly haven't given\nup the ruby ghost, but you can pass in your own method name with\nthe ``calculation_method_name`` arg to the field declaration.)\n\nNext, migrate your db schema to automatically include the new cache\ncontrol fields. Note that at least two fields will be added\nto this table, ``cached_slow_full_name`` of type *text*,\n``slow_full_name_recalculation_needed`` of type *boolean*, probably\ndefaulting to true, and possibly ``slow_full_name_expires_after`` of\ntype *datetime*, if we pass ``temporal_triggers=True`` into the field\ndeclaration (more on that later).\n\nAlready that's kinda better. ``lamppost.slow_full_name`` may take a\nwhile the first time it gets called for a given record, but from then\non, it'll be nigh instant. Of course, at this point, it will never\nchange after that first call.\n\nThe remaining important piece of the puzzle is to invalidate our cache\nusing ``flag_slow_full_name_as_stale``. It is probably changed in some\nviews.py (this example code could be more clever about noticing if the\nrelevant values are updated)::\n\n @render_to('lamppost/edit.html')\n def edit(request, lamppost_id):\n lamppost = Lamppost.objects.get(pk=lamppost_id)\n form = LamppostForm(request.POST, lamppost)\n if form.is_valid():\n form.save()\n lamppost.flag_slow_full_name_as_stale()\n return {'form': form, 'lamppost': lamppost}\n\n**This is the hardest part as the developer.** Caching requires you\nhunt down every place the value could be changed and calling that\n``flag_slow_full_name_as_stale`` method. Is country assigned a random\nnew value every morning at cron'o'clock? That flag had best be stale\nby cron'o'one. Do you calculate weight based on the sum of all\nassociated pigeons? Hook into the pigeons landing. And takeoff. And\neverything that changes an individual pigeon's weight. As Francis\nBacon said, \"There are only two hard problems in programming:\nnaming, cache invalidation and off-by-one errors.\"\n\nOne possible invalidation scheme you might want to use is expiration\ndates. We know the pigeons on our lamppost are going to die and turn\ninto ghosts, right::\n\n class Pigeon(models.Model):\n death_date = models.DateField()\n\n def die(self):\n self.weight = 0\n self.save()\n\nAnd rather than bother the pigeon-death-handling system, we'll take\nnote of their death as they land::\n\n class Lamppost(models.Model):\n #...\n def notice_pigeon_landing(self, pigeon):\n earliest = self.pigeon_set.all().aggregate(\n models.Min('death_date'))['death_date']\n self.expire_slow_full_name_after(earliest)\n\nOr maybe you only want the cache to ever be valid for 30 minutes, lest\n**They** have too easy a job tracking your thoughts.\n\nSo, yeah, you get the idea.\n\nInstallation\n------------\n\nYou can make things easy on yourself::\n\n pip install django-cached-field\n\nOr, for a more artisanal feeling, you can clone the repo and install it\nusing python and setup.py::\n\n git clone git@github.com:outofculture/django-cached-field.git\n cd django-cached-field/\n python setup.py install\n\nTested with django 1.3.1, celery 2.3.1, and django-celery 2.3.3, but I\nwould entertain other minimums if someone was willing to test them.\n\nConfiguration\n-------------\n\nUse of this library under at least version >= 1.6 of Django should not\nrequire any configuration changes; just import and use. For older\nDjangos, two settings changes are probably required for things to\nwork: make sure it's a registered app, make sure celery sees its tasks\nfile::\n\n INSTALLED_APPS += ['django_cached_field',]\n CELERY_IMPORTS += ['django_cached_field.tasks',]\n\nIf you're going to have expiration dates on your values, and you want\nto use timezone-aware datetimes, you will need to set this setting to\nTrue::\n\n CACHED_FIELD_USE_TIMEZONE = False # default\n\nOne setting for test environments: whether recalculation should happen\nwhen flagged as stale (default) or be left to the next time the\nattribute is accessed. This is useful for optimizing testing\nenvironments where you don't care that your cached values are invalid\nor that the expense of calculation is applied to a user. Note that, in\nthis situation, you wouldn't need celery. ::\n\n CACHED_FIELD_EAGER_RECALCULATION = True # default\n\nThis is a global option, so individual exceptions should instead be\nhandled by passing the ``and_recalculate`` argument to the\n``flag_FIELD_as_stale`` call.\n\nCaveats\n-------\n\n* All ORM methods (e.g. ``order_by``, ``filter``) can only access this field through ``cached_FIELD``.\n* ``recalculate_FIELD`` uses ``.update(cached_FIELD=`` to set the value. Don't expect ``.save`` to be called.\n* ``flag_FIELD_as_stale`` uses ``.update``, as well.\n* This may break if you try to add this mixin to a field class that multiply-inherits (I'm currently grabbing an arbitrary, non-CachedFieldMixin class and making the real field with it).\n* The FIELD_recalculation_needed field is accessed by regex in at least one place, so problems will result from user fields that match the same pattern.\n* Exceptions in a post-hook will potentially break saves of the data.\n\nTODO\n----\n\n* Figure out if we can turn temporal_triggers into a celery job that happens once at the given time.\n* All my tests are in the project I pulled this out of, but based on models therein. I don't have experience making tests for standalone django libraries. Someone wanna point me to a tutorial?\n* Recalculation task will not adapt to recalculation_needed_field_name option\n* Replace use of _recalculation_needed regex with class-level registry of cached fields.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/outofculture/django-cached-field", "keywords": "django caching", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-cached-field", "package_url": "https://pypi.org/project/django-cached-field/", "platform": "", "project_url": "https://pypi.org/project/django-cached-field/", "project_urls": { "Homepage": "https://github.com/outofculture/django-cached-field" }, "release_url": "https://pypi.org/project/django-cached-field/1.4.0/", "requires_dist": null, "requires_python": "", "summary": "Celery-deferred, cached fields on Django ORM for expensive-to-calculate attributes", "version": "1.4.0" }, "last_serial": 5213437, "releases": { "0.1dev": [ { "comment_text": "", "digests": { "md5": "e05ca4747590730391e6f8348b8c6329", "sha256": "8230738219d31ad3c266655b4fb4e8e170dee54a3a221eaf04e71a263607915e" }, "downloads": -1, "filename": "django-cached-field-0.1dev.tar.gz", "has_sig": false, "md5_digest": "e05ca4747590730391e6f8348b8c6329", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2776, "upload_time": "2011-12-09T23:16:10", "url": "https://files.pythonhosted.org/packages/21/97/b5c4a7adbb5f6eac706cd84f3556dfbfbd5aef84d86c076a8ccc8a02b557/django-cached-field-0.1dev.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "d259df59f79767824a1cb27e920baa59", "sha256": "42c5237596ebcdbf1d56ab364e0a827d2a5f75cdbfe077bdfaa94e247aa1a1e8" }, "downloads": -1, "filename": "django-cached-field-0.2.tar.gz", "has_sig": true, "md5_digest": "d259df59f79767824a1cb27e920baa59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2802, "upload_time": "2012-02-21T21:32:02", "url": "https://files.pythonhosted.org/packages/e7/53/346e5405cc9e66357ab41907ab9bb1452016c9fc63c9ec8f0c75cb3f1992/django-cached-field-0.2.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "9b5a21abcb052d3f75c4c6bd0387da5d", "sha256": "d1a744ec755e8e5eb00d2ff4898007d2bf1de58953da5612a93bce42f591bf38" }, "downloads": -1, "filename": "django-cached-field-1.0.tar.gz", "has_sig": false, "md5_digest": "9b5a21abcb052d3f75c4c6bd0387da5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2804, "upload_time": "2012-12-14T22:25:12", "url": "https://files.pythonhosted.org/packages/dd/c0/ff3835e1bda153deb4398669c3673d0e1377d32e9b1ad6383ad3664e84ab/django-cached-field-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "049ff109b745dc5199b096a9acdaadec", "sha256": "999e6b8b80a79d2c382ad2db6349b32f4ccefc5c499daf30f8160cb9e36763d6" }, "downloads": -1, "filename": "django-cached-field-1.1.tar.gz", "has_sig": false, "md5_digest": "049ff109b745dc5199b096a9acdaadec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3059, "upload_time": "2013-03-21T00:28:08", "url": "https://files.pythonhosted.org/packages/de/cc/484a173ba46a0aa36d6da806ad800cbed8e9161242c0e5a461ace8082f46/django-cached-field-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "a9f9cb45235274390dbdbf59e9e30e84", "sha256": "2077f7b32042053820170c6d582ab828988767dc74645400f9918a459563baf6" }, "downloads": -1, "filename": "django-cached-field-1.2.tar.gz", "has_sig": false, "md5_digest": "a9f9cb45235274390dbdbf59e9e30e84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3284, "upload_time": "2013-05-23T00:50:34", "url": "https://files.pythonhosted.org/packages/ad/95/72482016ee8b70b8ecaa2ad936c06c6ada1bad18c1d8922d33e13e6b4187/django-cached-field-1.2.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "8bdf54bb46d0c1054b37162720335c3a", "sha256": "140e468bd9338f8340ba71b802afb77967eda89327a09320cffc43c2e74330ea" }, "downloads": -1, "filename": "django-cached-field-1.2.1.tar.gz", "has_sig": false, "md5_digest": "8bdf54bb46d0c1054b37162720335c3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3323, "upload_time": "2013-05-23T19:07:36", "url": "https://files.pythonhosted.org/packages/fa/23/c3349c80fb512222317658b5ff29342061a8585581a8b98fd7b91d3054c6/django-cached-field-1.2.1.tar.gz" } ], "1.2.10": [ { "comment_text": "", "digests": { "md5": "5f4c655571904344d3c3f70303069769", "sha256": "172077ee72e3371a1e03d3595ec2a628021efb4b9d1bfdf823e1a4a9453efe2f" }, "downloads": -1, "filename": "django-cached-field-1.2.10.tar.gz", "has_sig": false, "md5_digest": "5f4c655571904344d3c3f70303069769", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6794, "upload_time": "2015-01-07T23:04:27", "url": "https://files.pythonhosted.org/packages/57/aa/814aef85ffac6ab9607ff06153e2b7ed64b79752e63e72e598dc5d65115f/django-cached-field-1.2.10.tar.gz" } ], "1.2.11": [ { "comment_text": "", "digests": { "md5": "34500ac8a40148ea43f76bc2f6511c81", "sha256": "eec964eeab0fcda30185b5912c21c78675792f1b5a13a7538333b453210dccca" }, "downloads": -1, "filename": "django-cached-field-1.2.11.tar.gz", "has_sig": false, "md5_digest": "34500ac8a40148ea43f76bc2f6511c81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6825, "upload_time": "2015-01-17T00:30:33", "url": "https://files.pythonhosted.org/packages/d0/f9/264df414e333007eec48ed5ccec7f0fa6978afd2adfd2296039932c7dffc/django-cached-field-1.2.11.tar.gz" } ], "1.2.12": [ { "comment_text": "", "digests": { "md5": "6dfd0f33e4b843a76d7033c53d9667d6", "sha256": "bc0fdd8f0182088c19f0a26517af61f8f6106289ee087c366493e85fae298e3a" }, "downloads": -1, "filename": "django-cached-field-1.2.12.tar.gz", "has_sig": false, "md5_digest": "6dfd0f33e4b843a76d7033c53d9667d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6900, "upload_time": "2015-08-04T21:45:05", "url": "https://files.pythonhosted.org/packages/c9/90/bdc59c38a4f1b0a8b861b225283993a3cd3ff183f1de6f7a5819d7e03b8e/django-cached-field-1.2.12.tar.gz" } ], "1.2.13": [ { "comment_text": "", "digests": { "md5": "3a0b0182c4d1dad0aa5e0f8eb14f0d2c", "sha256": "a5d5033c1702b7bedcc381acb9bc83889b147ca2cb874845c550a5d2f7d4b61e" }, "downloads": -1, "filename": "django-cached-field-1.2.13.tar.gz", "has_sig": false, "md5_digest": "3a0b0182c4d1dad0aa5e0f8eb14f0d2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6948, "upload_time": "2016-01-07T05:31:58", "url": "https://files.pythonhosted.org/packages/ea/df/c6f070bcc123756060c3ca41e7448e61cea5f41b0c04c0079690c985c8a2/django-cached-field-1.2.13.tar.gz" } ], "1.2.14": [ { "comment_text": "", "digests": { "md5": "7d0a825b5160c30296ff7b1b6dabeb00", "sha256": "3c170b0e152252fcf9720c094ecbb919f22bc1f32e22744155eb4d586a8b1b7e" }, "downloads": -1, "filename": "django-cached-field-1.2.14.tar.gz", "has_sig": false, "md5_digest": "7d0a825b5160c30296ff7b1b6dabeb00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6963, "upload_time": "2017-03-29T04:03:46", "url": "https://files.pythonhosted.org/packages/08/b3/853c6649e65420d003d5a3f55b222a315d8fa65940fcdecff0c6781e974d/django-cached-field-1.2.14.tar.gz" } ], "1.2.15": [ { "comment_text": "", "digests": { "md5": "74f23fb0ef4b6a5b79e9711a7e01f93c", "sha256": "207d99da86c6f3f4f36d663d99cf95cebbc671603a19211496cae16b348555cf" }, "downloads": -1, "filename": "django-cached-field-1.2.15.tar.gz", "has_sig": false, "md5_digest": "74f23fb0ef4b6a5b79e9711a7e01f93c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6956, "upload_time": "2017-03-29T04:02:08", "url": "https://files.pythonhosted.org/packages/e4/9d/92745882992ca7c784e0ec6803696523c5bacfaf6f335201cdd7057b2df0/django-cached-field-1.2.15.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "c5b4cea6d499d759bcc266b7ebe318ac", "sha256": "72389f4ea4c212f640c0288fb4ead2793e0d129f320602e0a1fef9e82ef5e01a" }, "downloads": -1, "filename": "django-cached-field-1.2.2.tar.gz", "has_sig": false, "md5_digest": "c5b4cea6d499d759bcc266b7ebe318ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3346, "upload_time": "2013-06-01T00:00:03", "url": "https://files.pythonhosted.org/packages/44/17/42315b0358fe71fd9123f076647bf0f919fccaee052cc7b838331e20c052/django-cached-field-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "a3ca1bbdf0c50c79ebef050a7db0fd69", "sha256": "1b380763c8f8047883234d73e52a9e1beef63a8c78aed07d74d814dec9c652ea" }, "downloads": -1, "filename": "django-cached-field-1.2.3.tar.gz", "has_sig": false, "md5_digest": "a3ca1bbdf0c50c79ebef050a7db0fd69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6356, "upload_time": "2013-07-03T20:54:17", "url": "https://files.pythonhosted.org/packages/16/5b/29f9df79ef52376e0053ddbf5ed21631cef7e64c98e4ab9d3dc149ba794b/django-cached-field-1.2.3.tar.gz" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "0e752352ade572f585cd3bff11f89139", "sha256": "03364d2d3978f99ea9f6940380c8d871faf24b5538592c47278e2ef6eeaf0b74" }, "downloads": -1, "filename": "django-cached-field-1.2.4.tar.gz", "has_sig": false, "md5_digest": "0e752352ade572f585cd3bff11f89139", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6465, "upload_time": "2013-07-05T19:03:15", "url": "https://files.pythonhosted.org/packages/3d/ae/8584b9a70b50aafa80ec9a059e9f227adf7b4229286ee092651dbd8da029/django-cached-field-1.2.4.tar.gz" } ], "1.2.5": [ { "comment_text": "", "digests": { "md5": "812aac213e4409843e4e784936ba790d", "sha256": "a6df2ed81063289a7da957c69d94a611aefc0082ad9e857c1c7b73702dd73ce5" }, "downloads": -1, "filename": "django-cached-field-1.2.5.tar.gz", "has_sig": false, "md5_digest": "812aac213e4409843e4e784936ba790d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6463, "upload_time": "2013-07-18T17:19:33", "url": "https://files.pythonhosted.org/packages/32/77/04f17399f7619e599c43f6c5edca257452c3879e842c5c1ead970425c008/django-cached-field-1.2.5.tar.gz" } ], "1.2.6": [ { "comment_text": "", "digests": { "md5": "535beeb4c365e26f838631acee325874", "sha256": "31dacf43eddaa2dae983366e8c7da866c1ef521719d365326f5896505cc43774" }, "downloads": -1, "filename": "django-cached-field-1.2.6.tar.gz", "has_sig": false, "md5_digest": "535beeb4c365e26f838631acee325874", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6486, "upload_time": "2014-01-11T05:53:42", "url": "https://files.pythonhosted.org/packages/8e/21/1004979ccb0b37468b63d347969ab86fbe730cd19b64459ba6c6a6798bae/django-cached-field-1.2.6.tar.gz" } ], "1.2.7": [ { "comment_text": "", "digests": { "md5": "6522814d04616d74c2fc0f0e63dfe594", "sha256": "8e6897dcfe0a351c84d982490ef2ec8c4a77e2d60d7dd28f29bb7c2276403d07" }, "downloads": -1, "filename": "django-cached-field-1.2.7.tar.gz", "has_sig": false, "md5_digest": "6522814d04616d74c2fc0f0e63dfe594", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6551, "upload_time": "2014-09-12T17:08:44", "url": "https://files.pythonhosted.org/packages/70/b6/b2fc1426015aef0b86aa9ac14ba5275a8e1c884aaddcefc0e9b4c7666f6c/django-cached-field-1.2.7.tar.gz" } ], "1.2.8": [ { "comment_text": "", "digests": { "md5": "297b9d1075a53bd64b2bfd131ed82618", "sha256": "5414810db4b12ff929009100a3cbfc6ec520becaa94bda4c34b2440e199c18c5" }, "downloads": -1, "filename": "django-cached-field-1.2.8.tar.gz", "has_sig": false, "md5_digest": "297b9d1075a53bd64b2bfd131ed82618", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6558, "upload_time": "2014-10-02T22:17:47", "url": "https://files.pythonhosted.org/packages/26/3b/74824dc3f8e6a927de1785e1c82772d2cd56466a849477db4285d1b2a8bc/django-cached-field-1.2.8.tar.gz" } ], "1.2.9": [ { "comment_text": "", "digests": { "md5": "13d7b91c2987ec44d9ca022be5b6d327", "sha256": "ec42e341b0bb33be49d9fee0b7de5b6ee3604dfd3876164858c6b971a5dbb47f" }, "downloads": -1, "filename": "django-cached-field-1.2.9.tar.gz", "has_sig": false, "md5_digest": "13d7b91c2987ec44d9ca022be5b6d327", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6725, "upload_time": "2014-12-01T19:20:50", "url": "https://files.pythonhosted.org/packages/6f/18/f5d9b6fe31f1b60fe597055dd332cc732b94d9f84cfc46626128a3f81fd7/django-cached-field-1.2.9.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "09873d363ceac4af23d93ccbebca2c34", "sha256": "4905b97ad7166ab1414ffedb6b347ea1ab5fb64c6f5c200aac0d8e6c7c0dd941" }, "downloads": -1, "filename": "django_cached_field-1.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "09873d363ceac4af23d93ccbebca2c34", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9342, "upload_time": "2018-10-26T04:40:45", "url": "https://files.pythonhosted.org/packages/89/cf/78a7055d63540f35946b905bf17b9d13fb396ea404482994e17c4675775f/django_cached_field-1.3.0-py2-none-any.whl" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "d26aeff7c10d512bdd365c948e97f5c0", "sha256": "132d0bbf8477986982047bc6404c615ed8ef5fd9a16333e5705cced553533ee5" }, "downloads": -1, "filename": "django_cached_field-1.3.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d26aeff7c10d512bdd365c948e97f5c0", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9306, "upload_time": "2018-11-02T21:56:16", "url": "https://files.pythonhosted.org/packages/ff/cf/da354a8223722ef3338b3b558735ec8b072953d5a2df134fb78994d8a1ca/django_cached_field-1.3.1-py2-none-any.whl" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "c21535dd77372539cbe0c5627b00eadf", "sha256": "0fd2bef717e1f62abec15170218aec72a84f7527ef2092d9be316e60684d3a95" }, "downloads": -1, "filename": "django-cached-field-1.4.0.tar.gz", "has_sig": false, "md5_digest": "c21535dd77372539cbe0c5627b00eadf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7863, "upload_time": "2019-05-01T17:40:44", "url": "https://files.pythonhosted.org/packages/41/d6/29f86acff487c56d40fd10ae6eca547786f3755f53cc00c26d60f7e0ff96/django-cached-field-1.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c21535dd77372539cbe0c5627b00eadf", "sha256": "0fd2bef717e1f62abec15170218aec72a84f7527ef2092d9be316e60684d3a95" }, "downloads": -1, "filename": "django-cached-field-1.4.0.tar.gz", "has_sig": false, "md5_digest": "c21535dd77372539cbe0c5627b00eadf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7863, "upload_time": "2019-05-01T17:40:44", "url": "https://files.pythonhosted.org/packages/41/d6/29f86acff487c56d40fd10ae6eca547786f3755f53cc00c26d60f7e0ff96/django-cached-field-1.4.0.tar.gz" } ] }