{ "info": { "author": "Maykin Media", "author_email": "support@maykinmedia.nl", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: Django", "Framework :: Django :: 2.2", "Intended Audience :: Developers", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: Unix", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "===============\nDjango Loose FK\n===============\n\n:Version: 0.5.4\n:Source: https://github.com/maykinmedia/django-loose-fk\n:Keywords: ``ForeignKey``, ``URL reference``, ``decentralization``, ``integrity``\n:PythonVersion: 3.7\n\n|build-status| |requirements| |coverage|\n\n|python-versions| |django-versions| |pypi-version|\n\nDjango Loose FK handles local or remote \"ForeignKey\" references.\n\nIn a decentralized API landscape various providers can offer the same type of\ndata, while your own API also provides this. The django model field allows\nyou to handle this transparently and present a unified, clean Python API.\n\n.. contents::\n\n.. section-numbering::\n\nFeatures\n========\n\n* Always work with Django model instances\n* Pluggable interface to fetch remote objects\n* Automatically supports DRF Hyperlinked serializers and serializer fields\n\nInstallation\n============\n\nRequirements\n------------\n\n* Python 3.7 or above\n* setuptools 30.3.0 or above\n* Django 2.0 or newer\n\n\nInstall\n-------\n\n.. code-block:: bash\n\n pip install django-loose-fk\n\n\nUsage\n=====\n\nAt the core sits a (virtual) django model field.\n\n.. code-block:: python\n\n from django_loose_fk.fields import FkOrURLField\n\n class SomeModel(models.Model):\n name = models.CharField(max_length=100)\n\n\n class OtherModel(models.Model):\n local = models.ForeignKey(SomeModel, on_delete=models.CASCADE, blank=True, null=True)\n remote = models.URLField(blank=True)\n relation = FkOrURLField(fk_field=\"local\", url_field=\"remote\")\n\n\nYou can now create objects with either local instances or URLs:\n\n.. code-block:: python\n\n some_local = SomeModel.objects.get()\n OtherModel.objects.create(relation=some_local)\n\n OtherModel.objects.create(relation=\"https://example.com/remote.json\")\n\n\nAccessing the attribute will always yield an instance:\n\n.. code-block:: python\n\n >>> other = OtherModel.objects.get(id=1) # local FK\n >>> other.relation\n \n\n >>> other = OtherModel.objects.get(id=2) # remote URL\n >>> other.relation\n \n\nIn the case of a remote URL, the URL will be fetched and the JSON response used\nas init kwargs for a model instance. The ``.save()`` method is blocked for\nremote instances to prevent mistakes.\n\nLoaders\n-------\n\nLoaders are pluggable interfaces to load data. The default loader is\n``django_loose_fk.loaders.RequestsLoader``, which depends on the ``requests``\nlibrary to fetch the data.\n\nYou can specify a global default loader with the setting ``DEFAULT_LOOSE_FK_LOADER``\n\n.. code-block:: python\n\n DEFAULT_LOOSE_FK_LOADER = \"django_loose_fk.loaders.RequestsLoader\"\n\nor override the loader on a per-field basis:\n\n.. code-block:: python\n\n from django_loose_fk.loaders import RequestsLoader\n\n class MyModel(models.Model):\n ...\n\n relation = FkOrURLField(\n fk_field=\"local\",\n url_field=\"remote\",\n loader=RequestsLoader()\n )\n\n\n\n.. |build-status| image:: https://travis-ci.org/maykinmedia/django-loose-fk.svg?branch=develop\n :target: https://travis-ci.org/maykinmedia/django-loose-fk\n\n.. |requirements| image:: https://requires.io/github/maykinmedia/django-loose-fk/requirements.svg?branch=develop\n :target: https://requires.io/github/maykinmedia/django-loose-fk/requirements/?branch=develop\n :alt: Requirements status\n\n.. |coverage| image:: https://codecov.io/gh/maykinmedia/django-loose-fk/branch/develop/graph/badge.svg\n :target: https://codecov.io/gh/maykinmedia/django-loose-fk\n :alt: Coverage status\n\n.. |python-versions| image:: https://img.shields.io/pypi/pyversions/django-loose-fk.svg\n\n.. |django-versions| image:: https://img.shields.io/pypi/djversions/django-loose-fk.svg\n\n.. |pypi-version| image:: https://img.shields.io/pypi/v/django-loose-fk.svg\n :target: https://pypi.org/project/django-loose-fk/\n\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/maykinmedia/django-loose-fk", "keywords": "TODO", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-loose-fk", "package_url": "https://pypi.org/project/django-loose-fk/", "platform": "", "project_url": "https://pypi.org/project/django-loose-fk/", "project_urls": { "Homepage": "https://github.com/maykinmedia/django-loose-fk" }, "release_url": "https://pypi.org/project/django-loose-fk/0.5.4/", "requires_dist": [ "django (>=2.2)", "djangorestframework", "django-filter", "pytest-cov ; extra == 'coverage'", "sphinx ; extra == 'docs'", "sphinx-rtd-theme ; extra == 'docs'", "drf-yasg ; extra == 'openapi'", "flake8 ; extra == 'pep8'", "bumpversion ; extra == 'release'", "psycopg2 ; extra == 'tests'", "pytest ; extra == 'tests'", "pytest-django ; extra == 'tests'", "tox ; extra == 'tests'", "isort ; extra == 'tests'", "requests ; extra == 'tests'", "requests-mock ; extra == 'tests'" ], "requires_python": "", "summary": "TODO", "version": "0.5.4" }, "last_serial": 5989723, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b4052ff7ab5175b26895a83f2a41d597", "sha256": "fa49ff1ea38e011fb74c1d2027eeb5a0942042ce434f63b677d2a31e02af1559" }, "downloads": -1, "filename": "django_loose_fk-0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b4052ff7ab5175b26895a83f2a41d597", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14784, "upload_time": "2019-08-02T14:11:16", "url": "https://files.pythonhosted.org/packages/9b/be/e373f7980a975bf7a7df2068edf1729c2ea9591b173a57dfc5c4406ac1d8/django_loose_fk-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3ea2fc7782844c5a25ad7a63ae8b9cb6", "sha256": "7be3c6caa9515c548728f7707909d264ea2af36c8f8799fd4b04b48033444f1c" }, "downloads": -1, "filename": "django-loose-fk-0.1.tar.gz", "has_sig": true, "md5_digest": "3ea2fc7782844c5a25ad7a63ae8b9cb6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10759, "upload_time": "2019-08-02T14:11:19", "url": "https://files.pythonhosted.org/packages/78/68/85a2606dd4ed852e6908191244a4bfaf10091d1140348ba3875e5e62d636/django-loose-fk-0.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "65127df1a1fbb6c1e0b4cac666b83ef5", "sha256": "52cde59d04dfae69da0f3b3537df64b5cd948aefbd094a75a9e427df25a8a701" }, "downloads": -1, "filename": "django_loose_fk-0.2.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "65127df1a1fbb6c1e0b4cac666b83ef5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15784, "upload_time": "2019-08-08T10:12:29", "url": "https://files.pythonhosted.org/packages/a7/78/2ea8c82abea6c66dfa1274941ad8d4cac32ef3f77271282e63f6a43f0d18/django_loose_fk-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a66f6d0d1b799e7c3a0bd56559cbe18d", "sha256": "4afb12ecae66addf5fd60ff906d663591e7559f36b52a43ce550b852bdcf16c5" }, "downloads": -1, "filename": "django-loose-fk-0.2.0.tar.gz", "has_sig": true, "md5_digest": "a66f6d0d1b799e7c3a0bd56559cbe18d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11343, "upload_time": "2019-08-08T10:12:31", "url": "https://files.pythonhosted.org/packages/1e/56/92838e2817c5c6afda60695a7785f4961dd19c1c01400dc99a96c5596f31/django-loose-fk-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "83caadd0d382b049667911008a22eb41", "sha256": "31ed9a66fff2ea4cdfb88cf06bbc06ee30f62213d04b2bc8158ba0236d58a44e" }, "downloads": -1, "filename": "django_loose_fk-0.3.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "83caadd0d382b049667911008a22eb41", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16940, "upload_time": "2019-08-08T12:07:31", "url": "https://files.pythonhosted.org/packages/46/53/f2eb4e9c8297b28ca6243f14a9c3b099888a1722b6f82d70dfbf0ee8f7f4/django_loose_fk-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "70eacd8568c7c0790e927ee0188b6cf3", "sha256": "bf6825235fb4e4ae5e21e8a6dc7e4cbc9b1f5b81308a61fdadf554a06e955b67" }, "downloads": -1, "filename": "django-loose-fk-0.3.0.tar.gz", "has_sig": true, "md5_digest": "70eacd8568c7c0790e927ee0188b6cf3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12662, "upload_time": "2019-08-08T12:07:34", "url": "https://files.pythonhosted.org/packages/b6/46/43c7fcc82ef987a98b934f04ae36436ad6ca9b2d45bc0210c8d8131e2917/django-loose-fk-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "f0111dfc7da0d86ce079768e60e9976d", "sha256": "31ed3ee75cda63a4c243aa65fb3686b7cb4ee30a8059e9f5f3747c36efa9c179" }, "downloads": -1, "filename": "django_loose_fk-0.4.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "f0111dfc7da0d86ce079768e60e9976d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21677, "upload_time": "2019-08-09T10:21:41", "url": "https://files.pythonhosted.org/packages/2e/04/9785424eb2373b26fba92e3860311af988d52837505a1963206474269057/django_loose_fk-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "411ad7d761d8602ad5b72a4d6c4e5111", "sha256": "f2daa4ffc99ae14191f7f059ee6d2149774e4098b9cc2e3a713eaaafa7cdfa04" }, "downloads": -1, "filename": "django-loose-fk-0.4.0.tar.gz", "has_sig": true, "md5_digest": "411ad7d761d8602ad5b72a4d6c4e5111", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14925, "upload_time": "2019-08-09T10:21:43", "url": "https://files.pythonhosted.org/packages/9b/b5/db1a4fdaaa31b83fd27e8f7b8ec11690c5e0a1489d4d2f63f108e6223f5e/django-loose-fk-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "8918f4ea0da365421378b462783b0306", "sha256": "2bbf15250c188a77dfc507c31e3cab71801c24570c83f5dcb716589e0776b08d" }, "downloads": -1, "filename": "django_loose_fk-0.5.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "8918f4ea0da365421378b462783b0306", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 25826, "upload_time": "2019-10-04T12:22:03", "url": "https://files.pythonhosted.org/packages/0a/f2/8357d4bc229b9fa348a6806b69764726983c2dbdc67592ed652d673d30f1/django_loose_fk-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5cdcd3b6553ff215675f40dd354ef70c", "sha256": "fe6f832b2d2f435a58572f1f3e106885c38e5f70b78637d7ca42cfd900e6f110" }, "downloads": -1, "filename": "django-loose-fk-0.5.0.tar.gz", "has_sig": true, "md5_digest": "5cdcd3b6553ff215675f40dd354ef70c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18624, "upload_time": "2019-10-04T12:22:05", "url": "https://files.pythonhosted.org/packages/2e/7f/3874350f06c0f594379b3939c545887f7cae89b2c79a9104b52b5517c8e1/django-loose-fk-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "2499061387e6e5718d70fc22663f6805", "sha256": "5d21997c6c1eb0b5747f4d13413a4e2b11c449b2131997aac7ee13d7b96dc2a8" }, "downloads": -1, "filename": "django_loose_fk-0.5.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "2499061387e6e5718d70fc22663f6805", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26440, "upload_time": "2019-10-10T09:34:21", "url": "https://files.pythonhosted.org/packages/71/67/4ef2fb28532e517a76392e1e2a095ce6c84425ee7bba3ac1528cf5c7042c/django_loose_fk-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fcd989c12f5838ebda43d333ae56e024", "sha256": "808d84d83e8194b5c46b1a2580e970277c63fe8f8f93101b216c4ab23a9619bf" }, "downloads": -1, "filename": "django-loose-fk-0.5.1.tar.gz", "has_sig": true, "md5_digest": "fcd989c12f5838ebda43d333ae56e024", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19064, "upload_time": "2019-10-10T09:34:24", "url": "https://files.pythonhosted.org/packages/cd/61/f6a1de7aab263ee10cb745278667fab640c1715c28bdb10733cec9c65e59/django-loose-fk-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "02231de6c313420c56c0d6b35625f3ab", "sha256": "bc5c551a2f6270183ddf3f160b5acf703f22e59e6dc4505e64037870f878945b" }, "downloads": -1, "filename": "django_loose_fk-0.5.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "02231de6c313420c56c0d6b35625f3ab", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27508, "upload_time": "2019-10-10T10:08:38", "url": "https://files.pythonhosted.org/packages/78/b4/0e6a4e9ca18ea96a858775b7c65811a07cb2ffe166f1beed10e2a32a6c42/django_loose_fk-0.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "32a6f635e38bb99ab2b909676ac56dac", "sha256": "cf25161d7743ceabcd6c232865412cb6764d0bdf1cf4dfa6c4bfce8d53ef85ac" }, "downloads": -1, "filename": "django-loose-fk-0.5.2.tar.gz", "has_sig": true, "md5_digest": "32a6f635e38bb99ab2b909676ac56dac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19443, "upload_time": "2019-10-10T10:08:41", "url": "https://files.pythonhosted.org/packages/03/fe/2d68abb7f52cbb4c18762e07d98405cbf79a6da1d8be493ebaf5aa9ff4b0/django-loose-fk-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "56cba3d7d3645afe29f0fd6e404c5fda", "sha256": "00385b7135c86fb64a3f7c20741ba23b88033c3921634111f2a0b46387138b4a" }, "downloads": -1, "filename": "django_loose_fk-0.5.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "56cba3d7d3645afe29f0fd6e404c5fda", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27719, "upload_time": "2019-10-15T14:52:13", "url": "https://files.pythonhosted.org/packages/77/33/fc57641ede5d5a0803900425863393a4058984cd5dd0890162da908c1209/django_loose_fk-0.5.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "760f97353333c4250df387be0e0d0e4a", "sha256": "6946ad3611985db880ee67629890f1d08ced0d0535516dfa085e1e383801405b" }, "downloads": -1, "filename": "django-loose-fk-0.5.3.tar.gz", "has_sig": true, "md5_digest": "760f97353333c4250df387be0e0d0e4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19666, "upload_time": "2019-10-15T14:52:16", "url": "https://files.pythonhosted.org/packages/c3/00/345621b9b9ed0f9e5d5c420bf7b0da598f42c8dd903c69d7aff4dd4257c0/django-loose-fk-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "d412b06d70815fb31a8ae4dfc0683680", "sha256": "3145f6d2736fb32d0f5a3b50b0ec96b609e3a68fa225b9e1660394ea72e2a581" }, "downloads": -1, "filename": "django_loose_fk-0.5.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "d412b06d70815fb31a8ae4dfc0683680", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27977, "upload_time": "2019-10-17T13:27:40", "url": "https://files.pythonhosted.org/packages/ef/dc/e98b5418160e3fe37c616c79a81e97e6a461d9e3f41a9fa9ad4c6cf41506/django_loose_fk-0.5.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09ba8fd0270b47ce3141437957a90b54", "sha256": "9a3d0175a4396b3433c70092527a3361c3a3a0e05d795e7b6b8148accd423039" }, "downloads": -1, "filename": "django-loose-fk-0.5.4.tar.gz", "has_sig": true, "md5_digest": "09ba8fd0270b47ce3141437957a90b54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19884, "upload_time": "2019-10-17T13:27:43", "url": "https://files.pythonhosted.org/packages/e3/d9/d5634b3ff0daadefbdcd27c0734d439a8fb336eef9e7e7735c657f025b8e/django-loose-fk-0.5.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d412b06d70815fb31a8ae4dfc0683680", "sha256": "3145f6d2736fb32d0f5a3b50b0ec96b609e3a68fa225b9e1660394ea72e2a581" }, "downloads": -1, "filename": "django_loose_fk-0.5.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "d412b06d70815fb31a8ae4dfc0683680", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27977, "upload_time": "2019-10-17T13:27:40", "url": "https://files.pythonhosted.org/packages/ef/dc/e98b5418160e3fe37c616c79a81e97e6a461d9e3f41a9fa9ad4c6cf41506/django_loose_fk-0.5.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09ba8fd0270b47ce3141437957a90b54", "sha256": "9a3d0175a4396b3433c70092527a3361c3a3a0e05d795e7b6b8148accd423039" }, "downloads": -1, "filename": "django-loose-fk-0.5.4.tar.gz", "has_sig": true, "md5_digest": "09ba8fd0270b47ce3141437957a90b54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19884, "upload_time": "2019-10-17T13:27:43", "url": "https://files.pythonhosted.org/packages/e3/d9/d5634b3ff0daadefbdcd27c0734d439a8fb336eef9e7e7735c657f025b8e/django-loose-fk-0.5.4.tar.gz" } ] }