Django-JsonField

BackEnd_Ash.log·2020년 11월 23일
1

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 을 열어준다.

JsonField save


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'}}]>

잘 출력되는것을 확인 할 수 있다.

JsonField filter

filter(data__name ='')


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'}

filter(dataaddressindex='')

In [41]: Shop.objects.filter(data__address__0='seoul')
Out[41]: <QuerySet [<Shop: Shop object (4)>, <Shop: Shop object (5)>, <Shop: Shop object (6)>]>

filter(data__has_key='occupation')

In [44]: Shop.objects.filter(data__has_key='occupation')
Out[44]: <QuerySet [<Shop: Shop object (4)>, <Shop: Shop object (5)>, <Shop: Shop object (6)>]>
profile
꾸준함이란 ... ?

2개의 댓글

comment-user-thumbnail
2021년 3월 22일

정확하게는 mysql에 대한 jsonfield support가 3.1부터 추가되었습니다. postgresql에 대한 jsonfield는 1.9 버전부터 존재했습니다 :) https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#jsonfield

1개의 답글