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

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

 更新時(shí)間:2023年06月08日 11:47:20   作者:西京刀客  
如果想實(shí)現(xiàn)JSONField的自動(dòng)轉(zhuǎn)換,可以使用Django REST framework的JSONField,或者自定義一個(gè)字段類并覆蓋from_db_value()和get_prep_value()方法來實(shí)現(xiàn)這個(gè)功能,這篇文章主要介紹了Django JSONField的自動(dòng)轉(zhuǎn)換(django自定義模型字段)問題,需要的朋友可以參考下

Django JSONField的自動(dòng)轉(zhuǎn)換(django自定義模型字段)

背景

Django v3.1的主要更新之一便是完善了對(duì)JSON數(shù)據(jù)存儲(chǔ)的支持,新增models.JSONField和forms.JSONField,可在所有受支持的數(shù)據(jù)庫后端上使用。

通過models.JSONField可指定此字段為存儲(chǔ)類型為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

思路

如果您想實(shí)現(xiàn)JSONField的自動(dòng)轉(zhuǎn)換,可以使用Django REST framework的JSONField,或者自定義一個(gè)字段類并覆蓋from_db_value()和get_prep_value()方法來實(shí)現(xiàn)這個(gè)功能。

DRF的JSONField更簡(jiǎn)單,但使用上相對(duì)復(fù)雜一些。自定義字段類的方法更輕量,但需要我們自己完成一定的編碼工作。

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

使用DRF的JSONField

要使用DRF的JSONField,主要是在Serializer中導(dǎo)入并應(yīng)用于需要自動(dòng)轉(zhuǎn)換JSON的字段,然后在視圖進(jìn)行序列化和反序列化,JSONField會(huì)自動(dòng)完成與之相關(guān)的所有轉(zhuǎn)換工作。

自定義一個(gè)字段類并覆蓋from_db_value()和get_prep_value()方法

直接使用JSONField不會(huì)自動(dòng)轉(zhuǎn)換,是因?yàn)?

  • JSONField只是一個(gè)簡(jiǎn)單的繼承自TextField的字段
  • 它本身并未實(shí)現(xiàn)from_db_value()和get_prep_value()方法
  • 所以當(dāng)我們?cè)L問instance.JSONField時(shí),得到的僅是JSON編碼后的字符串,而非Python對(duì)象
  • 它也不會(huì)在保存實(shí)例時(shí)自動(dòng)將Python對(duì)象重新轉(zhuǎn)換為JSON字符串

覆蓋模型字段的from_db_value()和get_prep_value()方法可以實(shí)現(xiàn)「自動(dòng)轉(zhuǎn)換」的效果。

  • from_db_value()方法用于數(shù)據(jù)庫讀取值時(shí)將值轉(zhuǎn)換為Python對(duì)象
  • get_prep_value()方法用于數(shù)據(jù)庫保存值前將Python對(duì)象轉(zhuǎn)換為值
    通過覆蓋這兩個(gè)方法,我們可以實(shí)現(xiàn)自定義的轉(zhuǎn)換邏輯,從而達(dá)到自動(dòng)轉(zhuǎn)換的效果。

django自定義模型字段 @models.register_field()

@models.register_field()是一個(gè)模型注冊(cè)裝飾器。使用它可以注冊(cè)自定義字段,使其可以像內(nèi)置字段一樣在模型中使用。

例如,使用了這個(gè)裝飾器的JSONField可以在模型中像此使用:
python
class Product(models.Model):
info = models.JSONField()
而不用導(dǎo)入字段類:
python
from .fields import JSONField

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

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

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

舉例:apps.py導(dǎo)入了,在具體的模型類中又單獨(dú)引入了這個(gè)JSONField,用的是哪個(gè)?
在這種情況下,Django會(huì)使用您在模型中直接導(dǎo)入的JSONField字段類。
也就是說,apps.py中的導(dǎo)入會(huì)被忽略,模型中導(dǎo)入的字段類會(huì)生效并在模型中實(shí)際使用。
這是因?yàn)?

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

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

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

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

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

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

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

相關(guān)文章

  • Python多線程爬取豆瓣影評(píng)API接口

    Python多線程爬取豆瓣影評(píng)API接口

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

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

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

    Python之Class&Object用法詳解

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

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

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

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

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

    Python使用Pygame繪制時(shí)鐘

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

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

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

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

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

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

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

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

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

最新評(píng)論

玛多县| 寿光市| 屏边| 荣成市| 衢州市| 铜鼓县| 年辖:市辖区| 会泽县| 保康县| 广昌县| 丽水市| 五河县| 宁陵县| 玉环县| 丹凤县| 湖南省| 台中县| 明溪县| 峨山| 东阿县| 清河县| 河源市| 吉林省| 汝州市| 西畴县| 台北市| 永善县| 霍城县| 连南| 晴隆县| 乌苏市| 安多县| 两当县| 沁水县| 乌鲁木齐市| 淮滨县| 齐河县| 岳阳县| 莆田市| 烟台市| 宾阳县|