РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
15 of 818 menu

Поле 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,
    которое хранит числа с плавающей точкой
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить