Explore my side projects and work using this link

Upsidedown is a WordPress theme design that brings blog posts rising above inverted header and footer components.

Django – ORM JSONFields 사용법

Written in

by

Advertisements

편리하게 사용할 수 있는 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):
    # (...생략...)
    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:

r = Person.objects.filter(data__has_key="name").all()

  • Contain

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

Assuming a Person had the following data

data = {“name”:"Peter”, “classes”: ["MATH", "ENG", "SCI"]}

Advertisements

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

r = Person.objects.filter(data__classes__contains=["MATH"]).all()

  • 필터링 조건


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

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

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

Tags