天天看點

Django3.x和2.x JSONFiled使用

AttributeError: module 'MySQLdb.constants.FIELD_TYPE' has no attribute 'JSON' while migrating in Django

 __init__.py

# import pymysql
# pymysql.version_info = (1, 3, 13, "final", 0)
# pymysql.install_as_MySQLdb()      

解決更新mysqlclient:

pip install mysqlclient==2.0.1


可支援jsonfield的django3和mysqlclient版本,此版本不在使用pymysql,
直接使用mysqlclient,并且注釋掉settings.py 中__init__.py pymysql引用,源碼無需修改:
      
Django==3.1.2      
mysqlclient==2.0.1      
amqp==1.4.9
anyjson==0.3.3
appdirs==1.4.4
asgiref==3.2.10
billiard==3.3.0.23
celery==3.1.26.post2
certifi==2020.6.20
chardet==3.0.4
click==7.1.2
click-didyoumean==0.0.3
click-repl==0.1.6
configparser==5.0.1
coreapi==2.3.3
coreschema==0.0.4
distlib==0.3.1
Django==3.1.2
django-celery==3.3.1
django-filter==2.4.0
django-mysql==3.9.0
djangorestframework==3.12.1
drf-extensions==0.6.0
fdfs-client-py==1.2.6
filelock==3.0.12
filetype==1.0.7
flower==0.9.5
humanize==3.0.1
idna==2.10
importlib-metadata==2.0.0
importlib-resources==3.0.0
install==1.3.4
itypes==1.2.0
Jinja2==2.11.2
jsonfield==3.1.0
jsonpath==0.82
kombu==3.0.37
MarkupSafe==1.1.1
minio==6.0.0
mutagen==1.45.1
mysqlclient==2.0.1
Pillow==8.0.1
prometheus-client==0.8.0
prompt-toolkit==3.0.8
psycopg2==2.8.6
PyMySQL==0.10.1
python-dateutil==2.8.1
pytz==2020.1
redis==2.10.6
requests==2.24.0
six==1.15.0
sqlparse==0.4.1
tornado==6.0.4
uritemplate==3.0.1
urllib3==1.25.10
vine==5.0.0
virtualenv==20.0.35
wcwidth==0.2.5
zipp==3.3.1      

 模型舉例:

def json_default():

    return {}      
class JsonModels(models.Model):
    names=models.CharField(max_length=50)
    attrs =models.JSONField(default=json_default)


    class Meta:
        db_table='tbl_test_jsonfiled'
        verbose_name="jsonfield測試"

傳參:      
Django3.x和2.x JSONFiled使用

 空值測試:

Django3.x和2.x JSONFiled使用

mysql> select * from tbl_test_jsonfiled;

+----+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| id | names | attrs |

+----+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| 1 | testjson | {"id": 2067, "age": 28, "sex": "男", "addr": "河南省濟源市北海大道32号", "gold": 100, "name": "小黑", "grade": "天蠍座", "phone": "12345678915"} |

| 2 | 測試空 | {} |

+----+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

其次還可以設定sql null :      
class JsonModels(models.Model):
    names=models.CharField(max_length=50)
    attrs =models.JSONField(null=True)


    class Meta:
        db_table='tbl_test_jsonfiled'
        verbose_name="jsonfield測試"      

mysql> select * from tbl_test_jsonfiled;

+----+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| id | names | attrs |

+----+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| 1 | testjson | {"id": 2067, "age": 28, "sex": "男", "addr": "河南省濟源市北海大道32号", "gold": 100, "name": "小黑", "grade": "天蠍座", "phone": "12345678915"} |

| 2 | 測試空 | {} |

| 3 | yan | NULL

django 2.x支援JSONField問題:      
pip install mysqlclient==2.0.1      
pip install django-mysql==3.9.0
pip install Django==2.2.17
注意事項:
1.注冊app django_mysql到settings應用裡面
2.使用方法:      
from django.db import models
from django_mysql.models import JSONField

class JsonModels(models.Model):
    names=models.CharField(max_length=50)
    attrs =JSONField(null=True)


    class Meta:
        db_table='tbl_jang2_jsonfiled'
        verbose_name="jsonfield測試"      

空值測試不傳則存為{}

mysql> select * from tbl_jang2_jsonfiled;

+----+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| id | names | attrs |

+----+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| 1 | jang2test | {} |

| 2 | jang2test | {"url": "http://127.0.0.1:7888/no/params?id=1001&name=WangXinRan&pwd=testapi", "json": null, "expect": null, "method": "get", "params": null, "headers": {"Content-Type": "application/x-www-form-urlencoded"}, "response_validation": null} |

+----+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

此外JSONField還可以存入List,string      

curl --location --request POST 'http://127.0.0.1:8000/testjson/' \

--header 'Content-Type: application/json' \

--data-raw '

{

"names":"listtest",

"attrs":[1,2,3,"hello",{"hello":"testt"}]

}'

mysql> select * from tbl_jang2_jsonfiled;

+----+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| id | names | attrs |

+----+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| 1 | jang2test | {} |

| 2 | jang2test | {"url": "http://127.0.0.1:7888/no/params?id=1001&name=WangXinRan&pwd=testapi", "json": null, "expect": null, "method": "get", "params": null, "headers": {"Content-Type": "application/x-www-form-urlencoded"}, "response_validation": null} |

| 3 | jang2test | {} |

| 4 | listtest | [1, 2, 3, "hello", {"hello": "testt"}] |

+----+-----------+---------------------------------------------------