Django – JSONFields 사용법 orm
편리하게 사용할 수 있는 JSONFields 사용법
PostgreSQL 데이터베이스는 지원하는 타입으로 옵션 필드 처리를 위해 사용한다.
사용법은 아래 내용 참고.
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>