Django – JSONFields 사용법 orm

목록으로 돌아가기

편리하게 사용할 수 있는 JSONFields 사용법

PostgreSQL 데이터베이스는 지원하는 타입으로 옵션 필드 처리를 위해 사용한다.

사용법은 아래 내용 참고.

https://ianjang.github.io/django-orm-postgresql-jsonfield%EC%97%90-%EB%8C%80%ED%95%B4-exclude-%EA%B5%AC%EB%AC%B8-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD/#json-field-%ED%95%84%ED%84%B0%EB%A7%81-%ED%85%8C%EC%8A%A4%ED%8A%B8

https://awstip.com/querying-djangos-jsonfield-a2914f5d4b91

선언부

class Book(models.Model):
    <em># (...생략...)</em>
    data = JSONField(null=True, blank=True)

데이터 생성

class TestJsonFieldFiltering(TestCase):
    def setUp(self):
        Book.objects.create(id=1, data=None)
        Book.objects.create(id=2, data={})
        Book.objects.create(id=3, data={'title': 'django'})
        Book.objects.create(id=5, data={'title': 'django', 'is_published': True})

활용법

  • 키값이 있는지 조사 __has_key

Results in the query:

<strong>r = Person.objects.filter(data__has_key="name").all()</strong>

  • Contain

r = Person.objects.filter(data__contains={“name”: “Peter”}).all()

Assuming a Person had the following data

<strong><em>data = {“name”:"Peter”, “classes”: ["MATH", "ENG", "SCI"]}</em></strong>

We can answer the question, Does the student take “MATH” classes?

<strong>r = Person.objects.filter(data__classes__contains=["MATH"]).all()</strong>

  • 필터링 조건

<em># is_published=True 조건 조회 시, 아래 두 ORM 구문 모두 예상한 결과가 나옵니다.</em>
Book.objects.filter(data__is_published=True) <em># O</em>
Book.objects.filter(Q(data__is_published=True) & Q(data__is_published__isnull=False)) <em># O</em>

<em># is_published=False 조건 조회 시, 아래 두 ORM 구문 모두 예상한 결과가 나옵니다. </em>
Book.objects.filter(data__is_published=False) <em># O</em>
Book.objects.filter(Q(data__is_published=False) & Q(data__is_published__isnull=False)) <em># O</em>

<em># is_published=True 만 제외하고 조회하려면 주의가 필요합니다. (예상 결과: 1, 2, 3, 4, 7, 8)</em>
Book.objects.exclude(data__is_published=True) <em># 예상과 다르 결과가 나옵니다.</em>
Book.objects.exclude(Q(data__is_published=True) & Q(data__is_published__isnull=False) <em># 예상한 결과가 나옵니다.</em>
Book.objects.filter(Q(data__is_published=False) | Q(data__is_published__isnull=True) <em># 예상한 결과가 나오며 가장 추천하는 방법입니다.</em>
author-profile
Written by bj