Skip to main content

Django json field empowered by pydantic

Project description

Django Structured JSON Field PyPI Codecov GitHub Workflow Status GitHub

This is a Django field that allows you to declare the structure of a JSON field and validate it.

Installation

pip install django-structured-field

Usage

from django.db import models
from structured.fields import StructuredJSONField
from structured.pydantic.models import BaseModel

# Define this schema as you would do with a Pydantic model
class MySchema(BaseModel):
    name: str
    age: int = None

def init_data():
    return MySchema(name='')

# Create a model with a StructuredJSONField with the schema you defined
class MyModel(models.Model):
    structured_data = StructuredJSONField(schema=MySchema, default=init_data)

Relationships

This field supports relationships between models, you can define them in your schema and they will be treated as normal django relationships. It also supports recursive schemas.

Recursion

You can define recursive schemas by declaring the attribute type as a string:

from typing import Optional, List

class MySchema(BaseModel):
    name: str
    age: int = None
    parent: Optional['MySchema'] = None
    relateds: List['MySchema'] = []

Foreign Keys

You can also define model relationships in your schema:

from structured.pydantic.fields import ForeignKey

class MySchema(BaseModel):
    name: str
    age: int = None
    fk_field: ForeignKey['MyModel'] = None

This will treat the parent field as a normal django ForeignKey.

Tip:

You can omit the ForeignKey field and just use the model class as the type annotation:

class MySchema(BaseModel):
    name: str
    age: int = None
    fk_field: MyModel = None

the field will still be treated as a ForeignKey if the type annotation is a subclass of django models.Model.

ManyToMany

If you need a ManyToMany relationship, you can use the QuerySet field:

from structured.pydantic.fields import QuerySet

class MySchema(BaseModel):
    name: str
    age: int = None
    parents: QuerySet['MyModel']

QuerySet fields will generate a django object manager that will allow you to query the related objects as you would do with a normal django QuerySet.

instance = MySchema(name='test', age=10, parents=MyModel.objects.all())
# You can filter the queryset
instance.parents.filter(name='test')
# You can count the queryset
instance.parents.count()
# You can get the first element of the queryset, etc...
instance.parents.first()

Cache

To prevent the field from making multiple identical queries a caching technique is used. The cache is still a work in progress, please open an issue if you find any problem. Actually the cache covers all the relations inside a StructuredJSONField, optimizing the queries during the serialization process.

Cache engine progress:

  • Shared cache between ForeignKey fields and QuerySet fields
  • Shared cache through nested schemas
  • Shared cache through nested lists of schemas
  • Shared cache between all StructuredJSONFields in the same instance
  • Shared cache between multiple instances of the same model
  • Cache invalidation mechanism

Settings

You can manage structured field behaviour modifying the STRUCTURED_FIELD setting in your settings.py file. Here a list of the available settings and their default values:

STRUCTURED_FIELD = {
    'CACHE':{
        'ENABLED': True,
        'SHARED': False # ⚠️ EXPERIMENTAL: this enables a thread-shared cache, it's not recommended to use it in production. 
    },
}

Contributing

The project is open to contributions, just open an issue or a PR.

Running tests

pip install -r requirements-dev.txt
make test

Running test app

pip install -r requirements-dev.txt
python manage.py migrate
python manage.py runserver

License

This project is licensed under the MIT License - see the LICENSE file for details

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_structured_json_field-0.1.0.tar.gz (1.7 MB view details)

Uploaded Source

Built Distribution

django_structured_json_field-0.1.0-py2.py3-none-any.whl (1.7 MB view details)

Uploaded Python 2 Python 3

File details

Details for the file django_structured_json_field-0.1.0.tar.gz.

File metadata

File hashes

Hashes for django_structured_json_field-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0593f3f3bfc95fff84489229f2805b16bd8af8b156968669599fe9f182b15fbd
MD5 243118541f442b7b675e05d4ace97bdb
BLAKE2b-256 d1d4b75d84a7519ab76a6750299fabcb7af9be0c753468fb028ceec00fd29b13

See more details on using hashes here.

File details

Details for the file django_structured_json_field-0.1.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_structured_json_field-0.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 8a30716a67e5f3a5d7fa355ab6955385517b3abf03e5899efeeb0c784f13a40c
MD5 07e0b2b581b6072b881a8a3faf7d213c
BLAKE2b-256 20b4bf67233e92e32b7fb3378bc33e4f544d5dabff54490227b51b266ed940fc

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