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

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

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

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

假設(shè)現(xiàn)在有一個(gè)Animal模型,其中有name, type, country字段,country為外鍵。我們在序列化Animal時(shí),需要額外增加外鍵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是一個(gè)read-only字段

當(dāng)不指定其method_name時(shí),默認(rèn)為get_field_name

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

補(bǔ)充知識:django restframework Serializer field

SerializerMethodField

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

簽名: SerializerMethodField(method_name=None)

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

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

場景介紹:一個(gè)用戶往往對應(yīng)多個(gè)角色,而角色字段并不在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ù)存在于多表中(因?yàn)楸碇泻卸鄬Χ嘧侄?,如何驗(yàn)證所有字段,并保存完整的數(shù)據(jù)到各表中。

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

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

實(shí)際源碼不是這樣子,但也就是這么個(gè)意思。

重寫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)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)JavaBeans流程詳解

    Python實(shí)現(xiàn)JavaBeans流程詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)JavaBeans流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐

    Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐

    本文主要介紹了Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Python爬蟲之Selenium實(shí)現(xiàn)關(guān)閉瀏覽器

    Python爬蟲之Selenium實(shí)現(xiàn)關(guān)閉瀏覽器

    這篇文章主要介紹了Python爬蟲之Selenium實(shí)現(xiàn)關(guān)閉瀏覽器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python 實(shí)現(xiàn)還原已撤回的微信消息

    Python 實(shí)現(xiàn)還原已撤回的微信消息

    這篇文章主要介紹了Python 神操作,還原已撤回的微信消息功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Python內(nèi)置模塊hashlib、hmac與uuid用法分析

    Python內(nèi)置模塊hashlib、hmac與uuid用法分析

    這篇文章主要介紹了Python內(nèi)置模塊hashlib、hmac與uuid用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了hashlib、hmac與uuid模塊的概念、功能及簡單使用方法,需要的朋友可以參考下
    2018-02-02
  • 利用PyTorch進(jìn)行模型量化的全過程

    利用PyTorch進(jìn)行模型量化的全過程

    模型量化是一種降低深度學(xué)習(xí)模型大小和加速其推理速度的技術(shù),它通過減少模型中參數(shù)的比特?cái)?shù)來實(shí)現(xiàn)這一目的,本文給大家介紹了利用PyTorch進(jìn)行模型量化的全過程,需要的朋友可以參考下
    2024-07-07
  • 舉例區(qū)分Python中的淺復(fù)制與深復(fù)制

    舉例區(qū)分Python中的淺復(fù)制與深復(fù)制

    這篇文章主要介紹了舉例區(qū)分Python中的淺復(fù)制與深復(fù)制,是Python入門學(xué)習(xí)中的重要知識,需要的朋友可以參考下
    2015-07-07
  • Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲

    Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲

    這篇文章主要介紹了Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Pytorch-mlu?實(shí)現(xiàn)添加逐層算子方法詳解

    Pytorch-mlu?實(shí)現(xiàn)添加逐層算子方法詳解

    本文主要分享了在寒武紀(jì)設(shè)備上?pytorch-mlu?中添加逐層算子的方法教程,代碼具有一定學(xué)習(xí)價(jià)值,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • python學(xué)習(xí) 流程控制語句詳解

    python學(xué)習(xí) 流程控制語句詳解

    下面小編就為大家?guī)硪黄猵ython學(xué)習(xí) 流程控制語句詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論