Поиск…


Синтаксис

  • from django.contrib.postgres.fields импортировать ArrayField
  • class ArrayField (base_field, size = None, ** options)
  • FooModel.objects.filter (array_field_name__contains = [objects, to, check])
  • FooModel.objects.filter (array_field_name__contained_by = [objects, to, check])

замечания

Обратите внимание, что хотя параметр size передается PostgreSQL, PostgreSQL не будет применять его.

При использовании ArrayField s следует помнить об этом предупреждении из документации по массивам Postgresql .

Совет. Массивы не являются наборами; поиск определенных элементов массива может быть признаком неправильной настройки базы данных. Рассмотрите возможность использования отдельной таблицы со строкой для каждого элемента, который будет элементом массива. Это будет легче искать и, скорее всего, лучше масштабируется для большого количества элементов.

Основной массив ArrayField

Чтобы создать PostgreSQL ArrayField, мы должны предоставить ArrayField тип данных, которые мы хотим сохранить в качестве поля в качестве первого аргумента. Поскольку мы будем хранить рейтинги книг, мы будем использовать FloatField .

 from django.db import models, FloatField
 from django.contrib.postgres.fields import ArrayField
 
 class Book(models.Model):
     ratings = ArrayField(FloatField())

Указание максимального размера массива ArrayField

 from django.db import models, IntegerField
 from django.contrib.postgres.fields import ArrayField
 
 class IceCream(models.Model):
     scoops = ArrayField(IntegerField()  # we'll use numbers to ID the scoops
                   , size=6)  # our parlor only lets you have 6 scoops

Когда вы используете параметр размера, он передается postgresql, который принимает его, а затем игнорирует его! Таким образом, вполне возможно добавить 7 целых чисел в поле scoops выше, используя консоль postgresql.

Запрос на членство в ArrayField с

Этот запрос возвращает все конусы с шоколадным ковшом и ванильным ковшом.

VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4  # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])

Не забудьте импортировать IceCream модель из вашего models.py файла.

Также имейте в виду, что django не будет создавать индекс для ArrayField s. Если вы собираетесь их искать, вам понадобится индекс, и его нужно будет создать вручную с помощью вызова RunSQL в вашем файле миграции.

Вложенные массивы

Вы можете ArrayField s, передав другой ArrayField поскольку это base_field .

from django.db import models, IntegerField
from django.contrib.postgres.fields import ArrayField

class SudokuBoard(models.Model):
    numbers = ArrayField(
        ArrayField(
            models.IntegerField(),
            size=9,
        ),
        size=9,
    )

Запрос для всех моделей, которые содержат любой элемент в списке с contains_by

Этот запрос возвращает все конусы либо соломинкой, либо ванильным ковшом.

minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow