Skip to main content

Django Loose FK handles local or remote "ForeignKey" references.

Project description

Version:
1.1.1
Source:

https://github.com/maykinmedia/django-loose-fk

Keywords:

ForeignKey, URL reference, decentralization, integrity

Build status Code quality checks black Coverage status

python-versions django-versions pypi-version

Django Loose FK handles local or remote “ForeignKey” references.

In a decentralized API landscape various providers can offer the same type of data, while your own API also provides this. The django model field allows you to handle this transparently and present a unified, clean Python API.

1 Features

  • Always work with Django model instances

  • Automatically added check constraints

  • Pluggable interface to fetch remote objects

  • Automatically supports DRF Hyperlinked serializers and serializer fields

2 Installation

2.1 Requirements

  • Python 3.10 or above

  • setuptools 30.3.0 or above

  • Django 3.2 or newer

2.2 Install

pip install django-loose-fk

3 Usage

At the core sits a (virtual) django model field.

from django_loose_fk.fields import FkOrURLField

class SomeModel(models.Model):
    name = models.CharField(max_length=100)


class OtherModel(models.Model):
    local = models.ForeignKey(SomeModel, on_delete=models.CASCADE, blank=True, null=True)
    remote = models.URLField(blank=True)
    relation = FkOrURLField(fk_field="local", url_field="remote")

You can now create objects with either local instances or URLs:

some_local = SomeModel.objects.get()
OtherModel.objects.create(relation=some_local)

OtherModel.objects.create(relation="https://example.com/remote.json")

Accessing the attribute will always yield an instance:

>>> other = OtherModel.objects.get(id=1)  # local FK
>>> other.relation
<SomeModel (pk: 1)>

>>> other = OtherModel.objects.get(id=2)  # remote URL
>>> other.relation
<SomeModel (pk: None)>

In the case of a remote URL, the URL will be fetched and the JSON response used as init kwargs for a model instance. The .save() method is blocked for remote instances to prevent mistakes.

3.1 Loaders

Loaders are pluggable interfaces to load data. The default loader is django_loose_fk.loaders.RequestsLoader, which depends on the requests library to fetch the data.

You can specify a global default loader with the setting DEFAULT_LOOSE_FK_LOADER

DEFAULT_LOOSE_FK_LOADER = "django_loose_fk.loaders.RequestsLoader"

or override the loader on a per-field basis:

from django_loose_fk.loaders import RequestsLoader

class MyModel(models.Model):
    ...

    relation = FkOrURLField(
        fk_field="local",
        url_field="remote",
        loader=RequestsLoader()
    )

3.2 Local and remote urls

If several services are hosted within the same domain, it could be tricky to separate local and remote urls. In this case an additional setting LOOSE_FK_LOCAL_BASE_URLS can be used to define an explicit list of allowed prefixes for local urls.

LOOSE_FK_LOCAL_BASE_URLS = [
    "https://api.example.nl/ozgv-t/zaken/",
    "https://api.example.nl/ozgv-t/catalogi/",
]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_loose_fk-1.1.1.tar.gz (28.8 kB view details)

Uploaded Source

Built Distribution

django_loose_fk-1.1.1-py3-none-any.whl (37.3 kB view details)

Uploaded Python 3

File details

Details for the file django_loose_fk-1.1.1.tar.gz.

File metadata

  • Download URL: django_loose_fk-1.1.1.tar.gz
  • Upload date:
  • Size: 28.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.8.19

File hashes

Hashes for django_loose_fk-1.1.1.tar.gz
Algorithm Hash digest
SHA256 5bd085579d9e6d589934386a8ead83da2cd48f2ced3571b66a970504e168a50f
MD5 44acbb72ef976a8c61b7859b37ad7176
BLAKE2b-256 7804e299d8d0add1da2ae0fef47b5a6e8a5cad927b1c3b189f2dcd852fd80ba1

See more details on using hashes here.

File details

Details for the file django_loose_fk-1.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_loose_fk-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4959e23cc7e5f82d55ea30beacb120fc4a7a94ea7bcfac94773fce86dd15608e
MD5 57cfd02807378bc1a09eed64bef92830
BLAKE2b-256 b1df1a8dd8dd2f9a35a3bdfd5aa52b37a3fe69f73eeac8c1b28568183e6e5dd3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page