Поле JSONField
Поле JSONField предназначено для хранения данных в формате JSON в базе данных. Оно позволяет сохранять любые структуры данных, которые можно представить в JSON: словари, списки, строки, числа и их комбинации. Данные автоматически преобразуются между Python-объектами и JSON-строкой при сохранении и извлечении из базы. Поле поддерживает базовые операции поиска и фильтрации по ключам JSON.
Синтаксис
from 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 для хранения характеристик товара:
from 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
Теперь сохраним товар с произвольными характеристиками:
# 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"])
Результат выполнения кода:
"Dell"
"True"
Пример
Для фильтрации записей по значениям внутри JSONField используются специальные операторы поиска. Найдем товары с определенной маркой:
from 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)
Результат выполнения кода:
"Laptop"
Пример
Также можно выполнять поиск по значениям внутри списков, хранящихся в JSONField. Например, найдем товары, у которых есть определенный тег:
from 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)
Результат выполнения кода:
"Smartphone"
Пример
Для получения всех ключей и их значений из JSONField можно использовать метод keys. Приведем пример работы с существующими данными:
from 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]}")
Результат выполнения кода:
"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,
которое хранит числа с плавающей точкой