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

django restframework serializer 增加自定義字段操作

 更新時間:2020年07月15日 08:54:10   作者:NashCyk  
這篇文章主要介紹了django restframework serializer 增加自定義字段操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

在使用django restframework serializer 序列化在django中定義的model時,有時候我們需要額外在serializer中增加一些model中沒有的字段。有兩種方法實現(xiàn)這個目的。

假設現(xiàn)在有一個Animal模型,其中有name, type, country字段,country為外鍵。我們在序列化Animal時,需要額外增加外鍵country的area信息。

方法一修改數(shù)據(jù)庫,利用model 這里就不多解釋,主要來說第二種,不修改django的model,直接使用SerializerMethodField(method_name=None)字段。

class AnimalSerializer(serializers.ModelSerializer):
 country_area = serializers.SerializerMethodField()

 class Meta:
  model = Animal
  fields = ('id', 'name', 'type','country','country_area')

 def get_country_area(self, obj):
  return obj.country.area

SerializerMethodFiel是一個read-only字段

當不指定其method_name時,默認為get_field_name

如果使用ModelSerializer并指定字段時,要包含此時定義的字段

補充知識:django restframework Serializer field

SerializerMethodField

這是一個只讀字段。它通過調(diào)用它所連接的序列化類的方法來獲得它的值。它可用于將任何類型的數(shù)據(jù)添加到對象的序列化表示中。

簽名: SerializerMethodField(method_name=None)

method_name - 要調(diào)用序列化對象的方法的名稱。如果不包含,則默認為 get_<field_name>.

由 method_name 參數(shù)引用的序列化方法應該接受一個參數(shù)(除了 self),這是要序列化的對象。它應該返回你想要包含在對象的序列化表示中的任何內(nèi)容。例如:

場景介紹:一個用戶往往對應多個角色,而角色字段并不在UserProfile表中,這就需要我們新增角色字段到user序列化中

from .models import UserProfile
from .models import UserRole

class UserProfileSerializer(serializers.ModelSerializer):
 """
 show list serializer
 """
 role = serializers.SerializerMethodField()

 class Meta:
  model = UserProfile
  # fields = "__all__"
  fields = ["id", "username","role", "account", "really_name", "department", "tel_phone",
     "create_time", "email", "last_time", "creator"]

 def get_role(self,obj):
  user_id = obj.id
  roles = [i.role.name for i in UserRole.objects.filter(user_id=user_id)]
  roles = ",".join(roles)
  return roles

相反的場景:我們提交的表單數(shù)據(jù)存在于多表中(因為表中含有多對多字段),如何驗證所有字段,并保存完整的數(shù)據(jù)到各表中。

剛開始的思路在ModelSerializer中新增未定義字段,然后發(fā)現(xiàn)這并不可行。我也犯了SerializerMethodField的錯誤,但隨后去讀了serializer的源碼,以及了解serializer的順序,就知道SerializerMethodField僅用于list方法。

問題的突破點到底在哪里呢,在drf serializer 官方文檔中就有一個知識點,serializer.save(**kwargs),kwargs數(shù)據(jù)被綁定在serializer.validated_data對象上,當create或update的時候就會被添加進數(shù)據(jù)庫,相當于validated_data.update(kwargs)

實際源碼不是這樣子,但也就是這么個意思。

重寫Serializer create,update方法

from rest_framework.utils import model_meta

 def create(self, validated_data):
  field= validated_data.pop('field_name')
  validated_data = validated_data
  instance = Model.objects.create(**validated_data)
  # ...外鍵表的操作
  return instance

 def update(self, instance, validated_data):
  field= validated_data.pop('field_name')
  info = model_meta.get_field_info(instance)

  for attr, value in validated_data.items():
   if attr in info.relations and info.relations[attr].to_many:
    field = getattr(instance, attr)
    field.set(value)
   else:
    setattr(instance, attr, value)
  instance.save()
  # ...
  return instance

以上這篇django restframework serializer 增加自定義字段操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python驅(qū)動ansys執(zhí)行apdl文件的代碼示例

    Python驅(qū)動ansys執(zhí)行apdl文件的代碼示例

    在Python中驅(qū)動ANSYS執(zhí)行APDL(ANSYS Parametric Design Language)文件,可以通過使用subprocess模塊來調(diào)用ANSYS的可執(zhí)行文件,并傳遞APDL文件作為參數(shù),本文給大家介紹了一個詳細的代碼示例,需要的朋友可以參考下
    2024-11-11
  • Python 通過截圖匹配原圖中的位置(opencv)實例

    Python 通過截圖匹配原圖中的位置(opencv)實例

    今天小編就為大家分享一篇Python 通過截圖匹配原圖中的位置(opencv)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python控制鍵盤鼠標pynput的詳細用法

    Python控制鍵盤鼠標pynput的詳細用法

    這篇文章主要介紹了Python控制鍵盤鼠標pynput的詳細用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Python中re.findAll()、re.sub()、set()的使用

    Python中re.findAll()、re.sub()、set()的使用

    本文主要介紹了Python中re.findAll()、re.sub()、set()的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Python使用pyecharts繪制世界地圖,省級地圖,城市地圖實例詳解

    Python使用pyecharts繪制世界地圖,省級地圖,城市地圖實例詳解

    這篇文章主要介紹了如何使用Python中的pyecharts庫繪制世界地圖、中國地圖、省級地圖、市級地圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-02-02
  • Python中的getopt函數(shù)使用詳解

    Python中的getopt函數(shù)使用詳解

    這篇文章主要介紹了Python中的getopt函數(shù)使用詳解,是Python進階學習中的重要知識,需要的朋友可以參考下
    2015-07-07
  • Python?OpenCV識別行人入口進出人數(shù)統(tǒng)計

    Python?OpenCV識別行人入口進出人數(shù)統(tǒng)計

    本文主要介紹了Python?OpenCV識別行人入口進出人數(shù)統(tǒng)計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>
    2023-01-01
  • python找出完數(shù)的方法

    python找出完數(shù)的方法

    今天小編就為大家分享一篇python找出完數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python模塊future用法原理詳解

    Python模塊future用法原理詳解

    這篇文章主要介紹了Python模塊future用法原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Python GUI編程之tkinter模塊Toplevel控件實現(xiàn)搭建父子窗口

    Python GUI編程之tkinter模塊Toplevel控件實現(xiàn)搭建父子窗口

    這篇文章主要介紹了Python使用tkinter模塊Toplevel控件搭建父子窗口的實現(xiàn)方法,Tkinter是Python的標準GUI庫,Python使用Tkinter可以快速的創(chuàng)建GUI應用程序,用到相關控件的同學可以參考下
    2023-12-12

最新評論

华蓥市| 湘潭市| 罗甸县| 汽车| 祁阳县| 沙坪坝区| 临西县| 台南县| 天气| 喀什市| 德安县| 泗洪县| 克什克腾旗| 麻城市| 晋州市| 贵南县| 金川县| 金乡县| 郎溪县| 通州区| 普格县| 黄山市| 峨山| 曲松县| 德安县| 阿坝| 蓬溪县| 林口县| 潞西市| 宜都市| 广灵县| 隆昌县| 迁西县| 盐亭县| 安泽县| 新丰县| 尼勒克县| 台前县| 湟源县| 兴文县| 肃北|