편리하게 사용할 수 있는 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})
활용법
Results in the query:
<strong>r = Person.objects.filter(data__has_key="name").all()</strong>
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>