欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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更簡單,但使用上相對復(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)文章

  • Python 使用生成器代替線程的方法

    Python 使用生成器代替線程的方法

    這篇文章主要介紹了Python 使用生成器代替線程的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • Python設(shè)計模式之簡單工廠模式實例詳解

    Python設(shè)計模式之簡單工廠模式實例詳解

    這篇文章主要介紹了Python設(shè)計模式之簡單工廠模式,結(jié)合實例形式分析了簡單工廠模式的概念、原理及相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程)

    Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程)

    這篇文章主要介紹了Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Selenium元素的常用操作方法分析

    Selenium元素的常用操作方法分析

    這篇文章主要介紹了Selenium元素的常用操作方法,結(jié)合實例形式分析Selenium在獲取元素之后針對點擊、輸入、提交、屬性獲取等常見操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • ?Python?匿名函數(shù)lambda?詳情

    ?Python?匿名函數(shù)lambda?詳情

    這篇文章主要介紹了?Python?匿名函數(shù)lambda,??lambda?????函數(shù)返回函數(shù)本身而不是將其賦值給一個變量名。所以它也被稱為匿名函數(shù),下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • 教你用Python尋找重復(fù)文件并刪除的腳本寫法

    教你用Python尋找重復(fù)文件并刪除的腳本寫法

    這篇文章主要介紹了如何用Python尋找重復(fù)文件并刪除,該腳本主要包括diskwalk,chechsum,find_dupes,delete模塊,其中diskwalk模塊是遍歷文件的,給定路徑,遍歷輸出該路徑下的所有文件,需要的朋友可以參考下
    2022-01-01
  • 使用Python-pptx?告別繁瑣的幻燈片制作

    使用Python-pptx?告別繁瑣的幻燈片制作

    這篇文章主要介紹了使用Python-pptx?告別繁瑣的幻燈片制作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python中的生成器、迭代器、裝飾器詳解

    python中的生成器、迭代器、裝飾器詳解

    本文詳細(xì)講解了python中的生成器、迭代器、裝飾器,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Python實現(xiàn)的歸并排序算法示例

    Python實現(xiàn)的歸并排序算法示例

    這篇文章主要介紹了Python實現(xiàn)的歸并排序算法,簡單描述了歸并排序算法的原理,并結(jié)合實例形式分析了Python實現(xiàn)歸并排序的具體操作技巧,需要的朋友可以參考下
    2017-11-11
  • tensorflow實現(xiàn)訓(xùn)練變量checkpoint的保存與讀取

    tensorflow實現(xiàn)訓(xùn)練變量checkpoint的保存與讀取

    今天小編就為大家分享一篇tensorflow實現(xiàn)訓(xùn)練變量checkpoint的保存與讀取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論