Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Django JSONField in model

I am creating REST API's.

django==3.2.2
djangorestframework==3.12.4
psycopg2==2.8.6

I am new to Django, python. I looking for a way to use the JSON field in the Django model. My model looks like below -

class Question(BaseModel):
.... other code...
    attributes = models.JSONField()

Now I want the attributes to be a JSON, like below

{
    "index": 0,
    "guid": "95161b18-75a8-46bf-bb1f-6d1e16e3d60b",
    "isActive": false,
    "latitude": -25.191983,
    "longitude": -123.930584,
    "tags": [
      "esse",
      "sunt",
      "quis"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Contreras Weeks"
      },
      {
        "id": 1,
        "name": "Dawn Lott"
      }
    ]
}

Should I create a new model, but creating a new model will make it add to migrations which I do not want.

  1. How to create a model for the above?
  2. How can I use the default validation provided by Django ORM on it?
like image 438
Ishika Jain Avatar asked Apr 02 '26 11:04

Ishika Jain


2 Answers

Django now natively supports JSONField.

like image 58
n_moen Avatar answered Apr 04 '26 02:04

n_moen


I figured out - we can use Pydantic or schema for Django. They also offer validation. I preferred Pydantic.

EDIT

Pydantic example

Schema:

from typing import List
from pydantic import (
    BaseModel,
    StrictBool,
    StrictInt,
    StrictStr,
)

class Foo(BaseModel):
    count: int
    size: float = None


class Bar(BaseModel):
    apple = 'x'
    banana = 'y'

class AttributesSchema(BaseModel):
    point: StrictInt
    value: StrictStr
    foo: Foo
    bars: List[Bar]

will return JSON like:

{
    'point': 2,
    'value': 'Any string'
    'foo': {'count': 4, 'size': None},
    'bars': [
        {'apple': 'x1', 'banana': 'y'},
        {'apple': 'x2', 'banana': 'y'},
    ],
}

Validation

Add this to your serializer:

schema = AttributesSchema
try:
    errors = schema.validate(data['attributes'])
except Exception as errors:
    raise serializers.ValidationError(errors)

Refer to Pydantic documentation, it has everything we need.

like image 21
Ishika Jain Avatar answered Apr 04 '26 03:04

Ishika Jain



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!