update 2021.3.23 jsonfield support
https://django-mysql.readthedocs.io/en/latest/model_fields/json_field.html
장고에서 3.1 버전부터 JSONField 라는것을 사용할 수 있게되었다 .
정확하게는 mysql 에 대한 jsonfield support 가 3.1 부터 추가가 되었다.
postgresql 에 대한 jsonfield 는 1.9버전부터 존재함.
https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#jsonfield
어떤 분이 댓글을 달아주셔서 수정합니다. 감사합니다 ! ^^
from django.db import models
# Create your models here.
class Shop(models.Model):
data = models.JSONField(default='{}')
class Meta:
db_table = "shops"
로 models 셋팅을 해준다.
그리고 나서
shell 을 열어준다.
In [1]: from shop.models import Shop
In [2]: first = Shop(data={'key' : 'value'})
In [3]: first.save()
In [4]: from shop.models import Shop
In [5]: second = Shop(data={'number' : 'value'})
In [6]: second.save()
저장하게 된다 .
데이터베이스를 확인해보면 이렇게 저장되어있는것을 확인할 수 있다.
objects 로 어떻게 출력되는지 확인을 해보자.
좀더 활용도 있게 사용을 해보게 되면 ,
데이터베이스를 확인하고 objects 확인하게 되면 ,
In [15]: from shop.models import Shop
In [16]: json_obj = {'name':'jakdu' , 'occupation' : 'programmer' , 'address':['seoul','songpa']}
In [17]: json_obj
Out[17]: {'name': 'jakdu', 'occupation': 'programmer', 'address': ['seoul', 'songpa']}
In [18]: type(json_obj)
Out[18]: dict
In [19]: Shop(data=json_obj).save()
In [20]: Shop.objects.values()
Out[20]: <QuerySet [{'id': 1, 'data': {'key': 'value'}}, {'id': 2, 'data': {'number': 'value'}}, {'id': 3, 'data': {'name': 'mac', 'order': True, 'price': 100}}, {'id': 4, 'data': {'name': 'jakdu', 'address': ['seoul', 'songpa'], 'occupation': 'programmer'}}]>
잘 출력되는것을 확인 할 수 있다.
In [26]: Shop.objects.filter(data__occupation='doctor')
Out[26]: <QuerySet []>
In [27]: Shop.objects.filter(data__occupation='programmer')
Out[27]: <QuerySet [<Shop: Shop object (4)>]>
In [28]: Shop.objects.filter(data__occupation='programmer')[0].data
Out[28]: {'name': 'jakdu', 'address': ['seoul', 'songpa'], 'occupation': 'programmer'}
In [29]: Shop(data={'name':'sory','address':['seoul','songpa'],'habit':['game','eat','soccer','baseball'],'occupation':'teatuer'}
...: ).save()
In [30]: Shop(data={'name':'hyuenseo','address':['seoul','songpa'],'habit':['game','heath','cook'],'occupation':'medical treatment'}).save()
In [33]: Shop.objects.filter(data__name='sory')[0].data
Out[33]:
{'name': 'sory',
'habit': ['game', 'eat', 'soccer', 'baseball'],
'address': ['seoul', 'songpa'],
'occupation': 'teatuer'}
In [34]: Shop.objects.filter(data__name='jakdu')[0].data
Out[34]: {'name': 'jakdu', 'address': ['seoul', 'songpa'], 'occupation': 'programmer'}
In [35]: Shop.objects.filter(data__name='hyuenseo')[0].data
Out[35]:
{'name': 'hyuenseo',
'habit': ['game', 'heath', 'cook'],
'address': ['seoul', 'songpa'],
'occupation': 'medical treatment'}
In [41]: Shop.objects.filter(data__address__0='seoul')
Out[41]: <QuerySet [<Shop: Shop object (4)>, <Shop: Shop object (5)>, <Shop: Shop object (6)>]>
In [44]: Shop.objects.filter(data__has_key='occupation')
Out[44]: <QuerySet [<Shop: Shop object (4)>, <Shop: Shop object (5)>, <Shop: Shop object (6)>]>
정확하게는 mysql에 대한 jsonfield support가 3.1부터 추가되었습니다. postgresql에 대한 jsonfield는 1.9 버전부터 존재했습니다 :) https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#jsonfield