DJango JsonField 和ListField實現


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, intfloatdict,或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,請確保它是可調用的,例如一個函數,或dictlist類本身。錯誤地使用可變對象(例如default={})會創建在字段的所有實例之間共享的單個對象。如果將平原listdict實例用於 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和因此適用於(近)無限制大小的列表(基礎LONGTEXTMySQL數據類型的最大長度為2 32 -1個字節)。

ListCharField base_fieldsize = None** kwargs 

用於存儲所有符合的數據列表的字段 base_field

base_field

列表中存儲的數據的基本類型。當前,必須是IntegerFieldCharField或其任何子類-ListCharField本身除外

size

(可選)設置列表中的最大項目數。僅在表單驗證時檢查,而不在模型保存時檢查!

作為ListCharField的子類CharFieldCharField 也可以設置任何選項。最重要的是,您需要設置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_fieldsize = 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})
... )

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM