org-docs: https://django-mysql.readthedocs.io/en/latest/model_fields/json_field.html
Installation
Install it with pip:
$ python -m pip install django-mysql
Or add it to your project’s requirements.txt
.
Add 'django_mysql'
to your INSTALLED_APPS
setting:
INSTALLED_APPS = ( ... 'django_mysql', )
Django-MySQL comes with some extra checks to ensure your configuration for Django + MySQL is optimal. It’s best to run these now you’ve installed to see if there is anything to fix:
$ ./manage.py check
類JSONField
(** kwargs )
用於存儲JSON的字段。Python的數據類型可以是str
, int
,float
,dict
,或list
-由支持基本上什么json.dumps
。這些類型之間沒有限制-如果您期望它僅存儲JSON對象,這可能會令人驚訝dict
。
因此,例如,以下所有工作:
mymodel.myfield = "a string" mymodel.myfield = 1 mymodel.myfield = 0.3 mymodel.myfield = ["a", "list"] mymodel.myfield = {"a": "dict"}
此字段需要Django 1.8+和MySQL 5.7+。這兩個要求都由該字段檢查,如果您不了解這兩個要求,則在運行Django的檢查時,您會為它們找到明智的錯誤。
警告
如果您給字段一個default
,請確保它是可調用的,例如一個函數,或dict
或list
類本身。錯誤地使用可變對象(例如default={}
)會創建在字段的所有實例之間共享的單個對象。如果將平原list
或dict
實例用於 default
,則有一個字段檢查是否出錯,因此對此有一定的保護措施。
提供豐富的默認值的正確方法是定義一個返回它的模塊級函數,以便可以在遷移中序列化它。例如:{'foo': 'bar'}
def my_default(): return {'foo': 'bar'} class MyModel(Model): attrs = JSONField(default=my_default)
from django_mysql.models import JSONField, Model class ShopItem(Model): name = models.CharField(max_length=200) attrs = JSONField() def __str__(self): return self.name
Django ListField
兩個字段的數據儲存列表,Django的的成年版本 CommaSeparatedIntegerField
,表兄弟 django.contrib.postgres
的 ArrayField
。有兩個版本: ListCharField
,基於CharField
和適用於存儲最大大小較小的列表,以及ListTextField
,基於 TextField
和因此適用於(近)無限制大小的列表(基礎LONGTEXT
MySQL數據類型的最大長度為2 32 -1個字節)。
-
類
ListCharField
(base_field,size = None,** kwargs ) -
用於存儲所有符合的數據列表的字段
base_field
。-
base_field
-
列表中存儲的數據的基本類型。當前,必須是
IntegerField
,CharField
或其任何子類-ListCharField
本身除外。
-
size
-
(可選)設置列表中的最大項目數。僅在表單驗證時檢查,而不在模型保存時檢查!
作為
ListCharField
的子類CharField
,CharField
也可以設置任何選項。最重要的是,您需要設置max_length
以確定在數據庫中保留多少個字符。示例實例:
from django.db.models import CharField, Model from django_mysql.models import ListCharField class Person(Model): name = CharField() post_nominals = ListCharField( base_field=CharField(max_length=10), size=6, max_length=(6 * 11) # 6 * 10 character nominals, plus commas )
在Python中,只需將字段的值設置為列表即可:
>>> p = Person.objects.create(name='Horatio', post_nominals=['PhD', 'Esq.']) >>> p.post_nominals ['PhD', 'Esq.'] >>> p.post_nominals.append('III') >>> p.post_nominals ['PhD', 'Esq.', 'III'] >>> p.save()
在save()上驗證
對數據庫執行從列表到字符串的轉換時,請
ListCharField
進行一些驗證,ValueError
如果有問題,則會進行提示,以避免保存錯誤的數據。以下是無效的:- 字符串表示形式中包含逗號的任何成員
- 任何字符串表示形式為空字符串的成員
默認表單字段為
SimpleListField
。 -
-
類
ListTextField
(base_field,size = None,** kwargs ) -
與相同
ListCharField
,但以a為后綴TextField
,因此長度的限制要少得多。沒有max_length
爭論。示例實例:
from django.db.models import IntegerField, Model from django_mysql.models import ListTextField class Widget(Model): widget_group_ids = ListTextField( base_field=IntegerField(), size=100, # Maximum of 100 ids in list )
JSON字段替換
classJSONReplace(expression, data) Given expression that resolves to some JSON data, replaces existing paths in it using the dictionary data of JSON paths to new values. If any JSON path within the data dictionary does not match, or if expression is NULL, it returns NULL. Paths that do not exist in the original data are ignored. Note that if expression is a string, it will refer to a field, whereas keys and values within the pairs dictionary will be wrapped with Value automatically and thus interpreted as the given string. If you want a key or value to refer to a field, use Django’s F() class. Docs: MySQL. >>> # Reset all items' monthly_sales to 0 directly in MySQL >>> ShopItem.objects.update( ... attrs=JSONReplace('attrs', {'$.monthly_sales': 0}) ... )