Django JSONField的自動轉(zhuǎn)換思路詳解(django自定義模型字段)
Django JSONField的自動轉(zhuǎn)換(django自定義模型字段)
背景
Django v3.1的主要更新之一便是完善了對JSON數(shù)據(jù)存儲的支持,新增models.JSONField和forms.JSONField,可在所有受支持的數(shù)據(jù)庫后端上使用。
通過models.JSONField可指定此字段為存儲類型為JSON格式。null=True表示此字段可以為空。
from django.db import models class Hello(models.Model): name = models.CharField(max_length=200) data = models.JSONField(null=True) def __str__(self): return self.name
思路
如果您想實現(xiàn)JSONField的自動轉(zhuǎn)換,可以使用Django REST framework的JSONField,或者自定義一個字段類并覆蓋from_db_value()和get_prep_value()方法來實現(xiàn)這個功能。
DRF的JSONField更簡單,但使用上相對復(fù)雜一些。自定義字段類的方法更輕量,但需要我們自己完成一定的編碼工作。
這里推薦使用自定義字段類的方法!
使用DRF的JSONField
要使用DRF的JSONField,主要是在Serializer中導(dǎo)入并應(yīng)用于需要自動轉(zhuǎn)換JSON的字段,然后在視圖進行序列化和反序列化,JSONField會自動完成與之相關(guān)的所有轉(zhuǎn)換工作。
自定義一個字段類并覆蓋from_db_value()和get_prep_value()方法
直接使用JSONField不會自動轉(zhuǎn)換,是因為:
- JSONField只是一個簡單的繼承自TextField的字段
- 它本身并未實現(xiàn)from_db_value()和get_prep_value()方法
- 所以當(dāng)我們訪問instance.JSONField時,得到的僅是JSON編碼后的字符串,而非Python對象
- 它也不會在保存實例時自動將Python對象重新轉(zhuǎn)換為JSON字符串
覆蓋模型字段的from_db_value()和get_prep_value()方法可以實現(xiàn)「自動轉(zhuǎn)換」的效果。
- from_db_value()方法用于數(shù)據(jù)庫讀取值時將值轉(zhuǎn)換為Python對象
- get_prep_value()方法用于數(shù)據(jù)庫保存值前將Python對象轉(zhuǎn)換為值
通過覆蓋這兩個方法,我們可以實現(xiàn)自定義的轉(zhuǎn)換邏輯,從而達到自動轉(zhuǎn)換的效果。
django自定義模型字段 @models.register_field()
@models.register_field()是一個模型注冊裝飾器。使用它可以注冊自定義字段,使其可以像內(nèi)置字段一樣在模型中使用。
例如,使用了這個裝飾器的JSONField可以在模型中像此使用:
python
class Product(models.Model):
info = models.JSONField()
而不用導(dǎo)入字段類:
python
from .fields import JSONField
class Product(models.Model):
info = JSONField()
總結(jié):這樣的話,就不用單獨導(dǎo)入字段類了(我們只需要在django啟動入口的位置,如apps.py中 導(dǎo)入JSONField。目的是為了使用@models.register_field裝飾器注冊這個字段,使其在Django知道并可以在任何模型中像內(nèi)置字段一樣使用)。如果不使用這個裝飾器,我們必須導(dǎo)入字段類后才能在模型中使用它。
另外,即使使用了@models.register_field裝飾器,我們也可以直接導(dǎo)入JSONField字段類并在模型中使用。
舉例:apps.py導(dǎo)入了,在具體的模型類中又單獨引入了這個JSONField,用的是哪個?
在這種情況下,Django會使用您在模型中直接導(dǎo)入的JSONField字段類。
也就是說,apps.py中的導(dǎo)入會被忽略,模型中導(dǎo)入的字段類會生效并在模型中實際使用。
這是因為:
- Django會根據(jù)實際使用解析哪個字段類,而不是根據(jù)哪個被導(dǎo)入了。
- 如果同一個字段類被 imports 了兩次,Python也只會使用最后一個導(dǎo)入的那個。
使用@models.register_field()帶來的好處是:
- 使自定義字段的使用看起來像內(nèi)置字段,較為簡潔直接,易于理解。
- 不用導(dǎo)入自定義字段類,模型可以獨立定義,解耦了字段的導(dǎo)入依賴。
- 自動處理字段的參數(shù),無需在模型中傳遞,使用起來像內(nèi)置字段。
- 方便第三方庫的集成,可直接在模型中使用第三方提供的自定義字段。
另外,需要注意的一點是,您使用了@models.register_field裝飾器,將JSONField注冊為了一個可以像內(nèi)建字段一樣使用的模型字段。
但是,Django在首次運行時需要導(dǎo)入這個字段類,才知道JSONField代表什么字段。
所以,您需要在首次使用JSONField的模型對應(yīng)的apps.py中導(dǎo)入這個字段類。
經(jīng)過測試Django-4.2.1,里沒有register_field裝飾器。
因此總結(jié)起來,直接定義自定義模型字段類,使用時單獨引入即可,這樣也不污染環(huán)境(不用在不用入口apps.py導(dǎo)一次,IDE還報灰色),即用即可,感覺更清晰。
到此這篇關(guān)于Django JSONField的自動轉(zhuǎn)換(django自定義模型字段)的文章就介紹到這了,更多相關(guān)django自定義模型字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程)
這篇文章主要介紹了Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09tensorflow實現(xiàn)訓(xùn)練變量checkpoint的保存與讀取
今天小編就為大家分享一篇tensorflow實現(xiàn)訓(xùn)練變量checkpoint的保存與讀取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02