最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django JSONField的自動轉(zhuǎn)換思路詳解(django自定義模型字段)

 更新時間:2023年06月08日 11:47:20   作者:西京刀客  
如果想實現(xiàn)JSONField的自動轉(zhuǎn)換,可以使用Django REST framework的JSONField,或者自定義一個字段類并覆蓋from_db_value()和get_prep_value()方法來實現(xiàn)這個功能,這篇文章主要介紹了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更簡單,但使用上相對復雜一些。自定義字段類的方法更輕量,但需要我們自己完成一定的編碼工作。

這里推薦使用自定義字段類的方法!

使用DRF的JSONField

要使用DRF的JSONField,主要是在Serializer中導入并應用于需要自動轉(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()方法
  • 所以當我們訪問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()
而不用導入字段類:
python
from .fields import JSONField

class Product(models.Model):
info = JSONField()

總結(jié):這樣的話,就不用單獨導入字段類了(我們只需要在django啟動入口的位置,如apps.py中 導入JSONField。目的是為了使用@models.register_field裝飾器注冊這個字段,使其在Django知道并可以在任何模型中像內(nèi)置字段一樣使用)。如果不使用這個裝飾器,我們必須導入字段類后才能在模型中使用它。

另外,即使使用了@models.register_field裝飾器,我們也可以直接導入JSONField字段類并在模型中使用。

舉例:apps.py導入了,在具體的模型類中又單獨引入了這個JSONField,用的是哪個?
在這種情況下,Django會使用您在模型中直接導入的JSONField字段類。
也就是說,apps.py中的導入會被忽略,模型中導入的字段類會生效并在模型中實際使用。
這是因為:

  • Django會根據(jù)實際使用解析哪個字段類,而不是根據(jù)哪個被導入了。
  • 如果同一個字段類被 imports 了兩次,Python也只會使用最后一個導入的那個。

使用@models.register_field()帶來的好處是:

  • 使自定義字段的使用看起來像內(nèi)置字段,較為簡潔直接,易于理解。
  • 不用導入自定義字段類,模型可以獨立定義,解耦了字段的導入依賴。
  • 自動處理字段的參數(shù),無需在模型中傳遞,使用起來像內(nèi)置字段。
  • 方便第三方庫的集成,可直接在模型中使用第三方提供的自定義字段。

另外,需要注意的一點是,您使用了@models.register_field裝飾器,將JSONField注冊為了一個可以像內(nèi)建字段一樣使用的模型字段。
但是,Django在首次運行時需要導入這個字段類,才知道JSONField代表什么字段。
所以,您需要在首次使用JSONField的模型對應的apps.py中導入這個字段類。

經(jīng)過測試Django-4.2.1,里沒有register_field裝飾器。

因此總結(jié)起來,直接定義自定義模型字段類,使用時單獨引入即可,這樣也不污染環(huán)境(不用在不用入口apps.py導一次,IDE還報灰色),即用即可,感覺更清晰。

到此這篇關(guān)于Django JSONField的自動轉(zhuǎn)換(django自定義模型字段)的文章就介紹到這了,更多相關(guān)django自定義模型字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python多線程爬取豆瓣影評API接口

    Python多線程爬取豆瓣影評API接口

    這篇文章主要介紹了Python多線程爬取豆瓣影評API接口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Python使用sftp實現(xiàn)上傳和下載功能

    Python使用sftp實現(xiàn)上傳和下載功能

    這篇文章主要為大家詳細介紹了Python使用sftp實現(xiàn)上傳和下載功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python之Class&Object用法詳解

    Python之Class&Object用法詳解

    今天小編就為大家分享一篇Python之Class&Object用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python獲取txt文件詞向量過程詳解

    python獲取txt文件詞向量過程詳解

    這篇文章主要介紹了python獲取txt文件詞向量過程詳解,如何讀取完整的大文件,而不會出現(xiàn)內(nèi)存不足memery error等問題,將讀取出來的文件,保存為npy文件,根據(jù)詞找到對應的向量,需要的朋友可以參考下
    2019-07-07
  • Python管理Windows服務(wù)小腳本

    Python管理Windows服務(wù)小腳本

    這篇文章主要為大家詳細介紹了Python管理Windows服務(wù)的小腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python使用Pygame繪制時鐘

    Python使用Pygame繪制時鐘

    這篇文章主要為大家詳細介紹了Python使用Pygame繪制時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Python實現(xiàn)的tcp端口檢測操作示例

    Python實現(xiàn)的tcp端口檢測操作示例

    這篇文章主要介紹了Python實現(xiàn)的tcp端口檢測操作,結(jié)合實例形式分析了Python使用socket模塊實現(xiàn)tcp端口檢測功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python實現(xiàn)暴力破解wifi密碼并打包成exe

    Python實現(xiàn)暴力破解wifi密碼并打包成exe

    python號稱是編程界的萬金油,那么是否可以做個讀取電腦網(wǎng)卡wifi并暴力破解的小腳本呢?在這個基礎(chǔ)上為了方便體驗是不是可以將其打包成exe這樣方便執(zhí)行的小應用呢?本文就來和大家一起聊聊
    2022-09-09
  • 詳解python和matlab的優(yōu)勢與區(qū)別

    詳解python和matlab的優(yōu)勢與區(qū)別

    在本文中小編給大家分享的是關(guān)于python和matlab的優(yōu)勢與區(qū)別的知識點以及實例代碼,需要的朋友們參考學習下。
    2019-06-06
  • python中@property和property函數(shù)常見使用方法示例

    python中@property和property函數(shù)常見使用方法示例

    這篇文章主要介紹了python中@property和property函數(shù)常見使用方法,結(jié)合實例形式分析了Python @property和property函數(shù)功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-10-10

最新評論

海阳市| 南川市| 松潘县| 信阳市| 密云县| 辉南县| 鲁甸县| 永年县| 三明市| 鲁山县| 兰州市| 景谷| 静宁县| 绍兴县| 松溪县| 莱州市| 绿春县| 长沙市| 海安县| 涟源市| 芮城县| 雅安市| 沙湾县| 甘泉县| 永定县| 高州市| 广德县| 湖南省| 九寨沟县| 揭东县| 宝应县| 公主岭市| 普宁市| 师宗县| 嘉鱼县| 周至县| 太康县| 香港 | 天水市| 凤台县| 陵川县|