Django-SerializerMethodField

目標

  • 有一個status狀態,後端存的是0、1,前端需要展示爲否、是
  • 後段返回給前端時,直接返回否、是,前端讀取展示,不需要判斷。

實現方法1,加字段

  • 加一個只讀字段status_zh,根據status判斷賦值後返回給前端,前端使用status_zh
  • 例:

    # models.py
    ######
    from django.db.models import Model, BooleanField
    
    class TestModel(Model):
        status = BooleanField(default=False, name='status')
      
        @property
        def status_zh(self):
            status_ = "是" if self.status else "否" 
            return status_
    ######
    
    # seriailzer.py
    ######
    from models import TestModel
    from rest_framework import serializers
    from rest_framework.serializers import SerializerMethodField, BooleanField
    class TestSerializer(serializers.ModelSerializer):
        status_zh = BooleanField(read_only=True)
      
        class Meta:
            model = TestModel
            fields = ("id", "status_zh", "status")

實現方法2,使用SerializerMethodField

  • 使用SerializerMethodField修改status的值
  • 例:

    # models.py
    ######
    from django.db.models import Model, BooleanField
    
    class TestModel(Model):
        status = BooleanField(default=False, name='status')
    
    ######
    
    # seriailzer.py
    ######
    from models import TestModel
    from rest_framework import serializers
    from rest_framework.serializers import SerializerMethodField
    class TestSerializer(serializers.ModelSerializer):
        status = SerializerMethodField()
      
        class Meta:
            model = TestModel
            fields = ("id", "status")
      
        def get_status(selef, obj):
            return "是" if obj.status else "否" 
  • 使用這個方法雖然簡化了一部分的代碼,但是也有隱患,status變成了一個read_only的值,無法進行修改,所以使用的時候需要考慮實際情況。

SerializerMethodField文檔解釋

這是一個只讀字段。它通過調用附加到的序列化程序類上的方法來獲取其值。它可用於將任何類型的數據添加到對象的序列化表示中。
簽名:SerializerMethodField(method_name=None)
method_name - 要調用的序列化程序上方法的名稱。如果不包含此默認值get_。
method_name參數引用的序列化方法應該接受一個參數(除了self),它是被序列化的對象。它應該返回您想要包含在對象的序列化表示中的任何內容。例如:

from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers
  
class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()
  
    class Meta:
        model = User
  
    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days

參考鏈接:時光不寫博客-Django-SerializerMethodField

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章