Поле JSONField

Поле JSONField предназначено для хранения данных в формате JSON в базе данных. Оно позволяет сохранять любые структуры данных, которые можно представить в JSON: словари, списки, строки, числа и их комбинации. Данные автоматически преобразуются между Python-объектами и JSON-строкой при сохранении и извлечении из базы. Поле поддерживает базовые операции поиска и фильтрации по ключам JSON.

Синтаксис

pythonfrom django.db import models

class Product(models.Model):
  attributes = models.JSONField(default=dict, blank=True)
  # OR
  metadata = models.JSONField(null=True, blank=True)

При определении поля можно указать параметр default для задания значения по умолчанию, а также параметры null и blank для управления допустимостью пустых значений.

Пример

Создадим модель с полем JSONField для хранения характеристик товара:

pythonfrom django.db import models

class Product(models.Model):
  name = models.CharField(max_length=100)
  attributes = models.JSONField(default=dict)

  def __str__(self):
    return self.name

Теперь сохраним товар с произвольными характеристиками:

python# Create product with JSON data
product = Product.objects.create(
  name="Laptop",
  attributes={
    "brand": "Dell",
    "memory": "16GB",
    "storage": "512GB SSD",
    "color": "silver",
    "in_stock": True
  }
)

print(product.attributes["brand"])
print(product.attributes["in_stock"])

Результат выполнения кода:

python"Dell"
"True"

Пример

Для фильтрации записей по значениям внутри JSONField используются специальные операторы поиска. Найдем товары с определенной маркой:

pythonfrom myapp.models import Product

# Find products with brand "Dell"
dell_products = Product.objects.filter(attributes__brand="Dell")

for product in dell_products:
  print(product.name)

Результат выполнения кода:

python"Laptop"

Пример

Также можно выполнять поиск по значениям внутри списков, хранящихся в JSONField. Например, найдем товары, у которых есть определенный тег:

pythonfrom myapp.models import Product

# Create product with tags list
Product.objects.create(
  name="Smartphone",
  attributes={
    "brand": "Apple",
    "tags": ["electronics", "mobile", "premium"],
    "price": 999.99
  }
)

# Find products with tag "premium"
premium_products = Product.objects.filter(attributes__tags__contains="premium")

for product in premium_products:
  print(product.name)

Результат выполнения кода:

python"Smartphone"

Пример

Для получения всех ключей и их значений из JSONField можно использовать метод keys. Приведем пример работы с существующими данными:

pythonfrom myapp.models import Product

# Get first product and its attributes keys
product = Product.objects.first()

if product:
  keys = product.attributes.keys()
  print("Attributes keys:", list(keys))

  for key in keys:
    print(f"{key}: {product.attributes[key]}")

Результат выполнения кода:

python"Attributes keys: ['brand', 'memory', 'storage', 'color', 'in_stock']"
"brand: Dell"
"memory: 16GB"
"storage: 512GB SSD"
"color: silver"
"in_stock: True"

Смотрите также

  • поле CharField,
    которое хранит строковые данные небольшой длины
  • поле IntegerField,
    которое хранит целочисленные данные
  • поле BooleanField,
    которое хранит логические значения True/False
  • поле FloatField,
    которое хранит числа с плавающей точкой