Django
ArrayField - PostgreSQL 고유의 필드
수색…
통사론
- django.contrib.postgres.fields에서 가져 오기 ArrayField
- class ArrayField (base_field, size = None, ** options)
- FooModel.objects.filter (array_field_name__contains = [객체, to, check])
- FooModel.objects.filter (array_field_name__contained_by = [객체, to, check])
비고
size
매개 변수는 PostgreSQL에 전달되지만 PostgreSQL에서는이를 적용하지 않습니다.
ArrayField
사용할 때 Postgresql 배열 문서 에서이 경고 단어를 염두에 두어야합니다.
팁 : 배열은 집합이 아닙니다. 특정 배열 요소를 검색하는 것은 데이터베이스 오 설계의 징후가 될 수 있습니다. 배열 요소가 될 각 항목에 대해 행이있는 별도의 테이블을 사용하는 것이 좋습니다. 이렇게하면 검색하기가 쉬우 며 많은 수의 요소에 대해 확장이 용이합니다.
기본 ArrayField
PostgreSQL ArrayField를 만들려면 ArrayField에 첫 번째 인수로 필드로 저장하려는 데이터 유형을 제공해야합니다. 책의 등급이 저장 될 FloatField
를 사용할 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
size 매개 변수를 사용하면 postgresql에 전달되어 받아 들여지고 무시됩니다. 따라서 postgresql 콘솔을 사용하여 위의 scoops
필드에 7 개의 정수를 추가하는 것이 가능합니다.
contains를 사용하여 ArrayField의 멤버를 쿼리합니다.
이 쿼리는 초콜렛 국자와 바닐라 국자가있는 모든 콘을 반환합니다.
VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4 # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])
models.py
파일에서 IceCream
모델을 가져 오는 것을 잊지 마십시오.
또한 장고는 ArrayField
대한 색인을 생성하지 않는다는 것을 명심하십시오. 색인을 검색하려면 인덱스가 필요하며 마이그레이션 파일에서 RunSQL을 호출하여 수동으로 생성해야합니다.
ArrayFields 중첩
당신은 중첩 할 수 ArrayField
다른 전달하여의를 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,
)
contained_by가있는 목록의 항목을 포함하는 모든 모델 쿼리
이 쿼리는 민트 국자 또는 바닐라 국자가있는 모든 원뿔을 반환합니다.
minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])