Django REST_framework 序列化與反序列化使用


model

class Goods(BaseModels):
    """
    商品
    """
    category = models.ForeignKey(GoodsCategory, verbose_name="商品類目", on_delete=models.SET_NULL, null=True, blank=True)
    goods_sn = models.CharField(max_length=50, default="", verbose_name="商品唯一貨號")
    name = models.CharField(max_length=100, verbose_name="商品名")
    click_num = models.IntegerField(default=0, verbose_name="點擊數")
    sold_num = models.IntegerField(default=0, verbose_name="商品銷售量")
    fav_num = models.IntegerField(default=0, verbose_name="收藏數")
    goods_num = models.IntegerField(default=0, verbose_name="庫存數")
    market_price = models.FloatField(default=0, verbose_name="市場價格")
    shop_price = models.FloatField(default=0, verbose_name="本店價格")
    goods_brief = models.TextField(max_length=500, verbose_name="商品簡短描述")
    goods_desc = models.TextField(verbose_name="內容", default='')
    ship_free = models.BooleanField(default=True, verbose_name="是否承擔運費")
    goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面圖")
    is_new = models.BooleanField(default=False, verbose_name="是否新品")
    is_hot = models.BooleanField(default=False, verbose_name="是否熱銷")

    class Meta:
        verbose_name = '商品'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

 

Serializer

from rest_framework import serializers
from . import models


class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = models.GoodsCategory
        fields = '__all__'


class GoodsSerializer(serializers.Serializer):
    name5 = serializers.CharField(source='name')  # source指定字段名, 但該字段名不能與name5重名
    goods_sn = serializers.CharField()  # 參數write_only序列化的時候, 該字段不顯示   參數read_only反序列化的時候該字段不傳
    category = serializers.CharField(source='category.name')  # 外鍵返回一個category對象, 可以使用source指定對象中的屬性  category.name
    type = serializers.CharField(source='category.get_category_type_display')  # 通過get_'字段名'_display獲取choice的值
    func = serializers.SerializerMethodField()  # 通過SerializerMethodField方法返回一個鈎子函數的返回值
    types = serializers.SerializerMethodField()  # 通過自定義字典的元素返回數據
    typeall = serializers.SerializerMethodField()  # 通過序列化類返回數據

    def get_func(self, obj):  # 必須使用get_'字段名'作為方法名, 必須傳入一個參數, obj 為Goods對象
        return obj.name

    def get_types(self, obj):
        return {'name':obj.category.name, 'desc': obj.category.desc}

    def get_typeall(self, obj):
        res = CategorySerializer(obj.category)
        return res.data

 

ModelSerializer

from rest_framework import serializers
from . import models

class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Goods
        # fields = '__all__'  # 全部字段
        # fields = ['name', 'shop_price']  # 列表中的字段
        exclude = ['name', 'shop_price']  # 排除列表中的字段, 不能與fields一起使用
        depth = 1  # 深度為1, 最多推薦3

    # 同Serializer方法使用更改字段

 

 

反序列化

serializer

from rest_framework import serializers
from . import models



class GoodsSerializer(serializers.Serializer):
    name5 = serializers.CharField(source='name')  # source指定字段名, 但該字段名不能與name5重名

    def create(self, validated_data):  # 必須重寫create 方法, 不然會斷言
        ret = models.Goods.objects.create(**validated_data)  # 將傳過來的數據保存數據庫
        return ret

 

views   post

    def post(self, request):
        back_dic = {'code': 100, 'msg': '', 'data': None}
        goodser = serialize.GoodsSerializer(data=request.data)  # 將傳過來的數據反序列化
        if goodser.is_valid():  # 通過is_valid為True, 並且將數據添加進validated_data
            ret = goodser.create(goodser.validated_data)  # 重寫create方法
            back_dic['msg'] = '添加成功'
            back_dic['data'] = ret.name
        return Response(back_dic)

 

全局鈎子與局部鈎子校驗數據

from rest_framework import serializers
from . import models
from rest_framework.exceptions import ValidationError


class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Goods
        # fields = '__all__'  # 全部字段
        fields = ['name', 'shop_price']  # 列表中的字段
        # exclude = ['name', 'shop_price']  # 排除列表中的字段, 不能與fields一起使用
        depth = 1  # 深度為1, 最多推薦3

    # 同Serializer方法使用更改字段

    def validate_name(self, value):
        if value == '123':
            print(value)  # value為該字段的值
            raise ValidationError('不能為123')  # 將異常添加入errors中  可以通過goodser.errors獲取
        return value

    def validate(self, attrs):
        if attrs.get('name') == attrs.get('shop_price'):  # attrs 為校驗的數據, 為一個字典
            raise ValidationError('123')
        return attrs

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM