JSON API specification for Django services
Project description
django-json-api
django-json-api uses Django's ORM interfaces as inspiration to serialize, request and deserialize entities from databases of other microservices using (and benefiting from) the JSON:API specification.
Installation
To install via pip:
pip install django-json-api
You can also install from the source:
git clone git@github.com:reveal-co/django-json-api.git
cd django-json-api
git checkout main
pip install -e .
Getting started
Suppose you have a django.db.models.Model
class inside microservice A, such as:
from django.db import models
class Company(models.Model):
name = models.CharField(max_length=256)
domain = models.CharField(max_length=256)
deleted_at = models.DateTimeField(null=True, default=None)
If you wish to consume it from microservice B, first add this inside the aforementioned model's definition:
class JSONAPIMeta:
resource_name = 'companies'
and define an instance of a django_json_api.models.JSONAPIModel
inside microservice B:
from django_json_api.models import JSONAPIModel
from django_json_api.fields import Attribute
class Company(JSONAPIModel):
class Meta:
api_url = MICROSERVICE_A_API_URL
resource_type = 'companies'
name = Attribute()
domain = Attribute()
PS: api_url
expects a url with protocol (i.e. starting with http(s)://
) and ending with a trailing slash /
.
Now, querying companies from microservice B is as easy as:
Company.objects.all()
Company.objects.filter(name="Reveal")
Company.objects.iterator()
...
You can also have entities in one microservice relate to entities in another by leveraging both RelatedJSONAPIField
and WithJSONAPIQuerySet
. Take a look at this model definition from microservice B:
from django.db import models
from django_json_api.django import RelatedJSONAPIField
class User(models.Model):
name = models.CharField(max_length=256)
company = RelatedJSONAPIField(json_api_model=Company)
deleted_at = models.DateTimeField(null=True, default=None)
Here, Company
is the JSONAPIModel
defined above. This makes it possible, when querying for a user, to also
fetch its related company:
user = User.objects.get(pk=1)
user.company # This will be resolved through an underlying HTTP request
In case of larger querysets, you might want to prefetch the relations as you do with django's prefetch_related
. For
that, you imbue User
's manager using WithJSONApiQuerySet
, which will grant the manager a new
method: prefetch_jsonapi
.
If the remote microservice API supports PATCH request, you can save a record's attributes:
user = User.objects.get(pk=1)
print(user.name) # Joe
user.name = "Jack"
user.save(update_fields=["name"]) # This will perform a PATCH HTTP request
updated_user = User.from_cache(pk=1)
print(updated_user.name) # Jack: the updated record with its new attributes is cached
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_json_api-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b6f4a4b5ea6e507a2c60dd72ec407122dc245991f7c5e9e315926c0c82f3dd96 |
|
MD5 | e9c6b2bf69d4e8ce4f3add807d40d8b9 |
|
BLAKE2b-256 | da03d3372b38ec5bef57d606a2f3982b3d24a6242e72f4500cc81a9574dba4e9 |