首页 > 其他分享 >drf序列化器之反序列化的数据验证

drf序列化器之反序列化的数据验证

时间:2023-03-08 09:34:58浏览次数:43  
标签:__ vendor name models 器之反 import 序列化 manufacturer drf

模型层

from django.db import models

# Create your models here.
class Manufacturer(models.Model):
    ## 厂商
    vendor_name = models.CharField("厂商名称",max_length=32,db_index=True,unique=True,help_text="厂商名称")
    tel = models.CharField("联系电话",null=True,max_length=15,help_text="联系电话")
    mail = models.CharField("联系邮件",null=True,max_length=32,help_text="联系邮件")
    remark = models.CharField("备注",null=True,max_length=300,help_text="备注")


    def __str__(self):
        return self.vendor_name
    class Meta:
        db_table= 'resources_manufacturer'

class ProductModel(models.Model):
    ## 产品
    model_name = models.CharField("型号名称",max_length=20,help_text="型号名称")
    vendor = models.ForeignKey(Manufacturer,on_delete=models.CASCADE,verbose_name="所属制造商",help_text="供应商")


    def __str__(self):
        return self.model_name
    class Meta:
        db_table= 'resources_productmodel'
        ordering = ["id"]

序列化

manufacturer:productmodel_set 是 1对多的关系

>>> from manufacturer.models import Manufacturer
>>> Manufacturer.objects.all()
<QuerySet [<Manufacturer: DELL>]>
>>> m = Manufacturer.objects.all()[0]
>>> m
<Manufacturer: DELL>
>>> m.productmodel_set.all()
<QuerySet [<ProductModel: DELL01>]>

from rest_framework import serializers
from .models import Manufacturer, ProductModel
# ModelSerializer 自动处理字段,并且自动重写了create和update方法。
# 相当于是个快捷方式,对于模型简单的适用,如果关联的字段比较复杂,不适用


class ManufactureSerializer(serializers.ModelSerializer):
    class Meta:
        model = Manufacturer
        fields = "__all__"


class ProductModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductModel
        fields = "__all__"

    '''

    # 字段级别验证,例如对title,针对单个字段值,例如传入的数据全部小写
    def validate_title(self,value):
        print(value)
        # 一定要有返回值
        return value.lower()
    '''
    # 模型级别,表级别验证,不跟任何字段名,例如在业务层起到主键的作用,产品模型不能重复


    def validate(self, attrs):
        # 得到服务器对应的制造商对象
        # manufacturer_obj.productmodel_set 返回的是 queryset集合
        # 类似<QuerySet [<ProductModel: DELL01>]>

        manufacturer_obj = attrs["vendor"]
        try:
            # manufacturer_obj.productmodel_set 返回的是 queryset集合
            # 类似<QuerySet [<ProductModel: DELL01>]>
            manufacturer_obj.productmodel_set.get(model_name__exact=attrs['model_name'])
            # 捕获到异常,进行抛出
            raise serializers.ValidationError(detail="该产品模型已经存在")
        except Exception as e:
            print(e)
        return attrs

        
    
    def to_representation(self, instance):
        vendor = instance.vendor
        ret = super().to_representation(instance)
        ret["vendor"] = {
            "id": vendor.id,
            "name": vendor.vendor_name,
        }
        return ret

视图层

# 导入子模块的视图
from idcs.views import IdcViewSet
from users.views import UserViewSet
from cabinet.views import CabinetViewSet
from manufacturer.views import ManufacturerViewSet,ProductModelViewSet

# 注册
route = DefaultRouter()
route.register("idcs",IdcViewSet,basename="idcs")
route.register("users",UserViewSet,basename="users")
route.register("cabinet",CabinetViewSet,basename="cabinet")
route.register("manufacturer",ManufacturerViewSet,basename="manufacturer")
route.register("ProductModel",ProductModelViewSet,basename="ProductModel")

 

标签:__,vendor,name,models,器之反,import,序列化,manufacturer,drf
From: https://www.cnblogs.com/beichengshiqiao/p/17190789.html

相关文章

  • PHP:json_encode序列化中文字符和json_decode反序列化object
    json_encode序列化<?php$name='你好';echojson_encode($name).PHP_EOL;//"\u4f60\u597d"echojson_encode($name,JSON_UNESCAPED_UNICODE).PHP_EOL;//"......
  • TypechoCMS 反序列化漏洞
    前言这学期的专业实习周的第七个实验:TypechoCMS反序列化漏洞的代码审计,因为是学校的实验内容,所以难度也会比较低一些环境搭建TypechoCMS官方:https://typecho.org/漏......
  • hutool XML反序列化漏洞(CVE-2023-24162)
    漏洞简介Hutool中的XmlUtil.readObjectFromXml方法直接封装调用XMLDecoder.readObject解析xml数据,当使用readObjectFromXml去处理恶意的XML字符串时会造成任意代......
  • C#/.net 序列化与反序列化
    序列化就是将我们程序中的对象通过字节流写入存储媒体或网络流中。反序列化就是把已存入的媒体或接收的网络流中的内容转换成程序运行中的对象。这两个过程结合起来,可以轻......
  • 多对多三种创建方式,django内置序列化组件(drf前身),批量操作数据,分页器思路,自定义
    多对多三种创建方式,django内置序列化组件(drf前身),批量操作数据,分页器思路,自定义分页器的使用,form组件多对多三种创建方式1.全自动创建 classBook(models.Model):......
  • java序列化 教程
    序列化的条件:序列化必须要满足两个条件:1.该对象必须实现java.io.Serializble接口2.改对象的所有属性必须是可序列化的,若有属性不可序列化也须注明是短暂的 注:检......
  • 模型类序列化器、ModelSerializer用法、exclude排除某个字段用法、extra_kwargs中用wr
    1.序列表表所有字段返回结果:   2.url:   3.序列化表和表里的所有字段:   4.views代码:   5.序列化表中的指定字段:   6.exclude......
  • DRF
    1.RESTful规范博客REST风格--资源网页中能看到的都是资源--URI统一资源标识符--URL统一资源定位符--统一资源接口对资源的操作根据HTTP请......
  • java序列化
    privatestaticfinallongserialVersionUID=1L意思是定义程序序列化ID。序列化ID,相当于身份认证,主要用于程序的版本控制,保持不同版本的兼容性,在程序版本升级时避免程序......
  • 反序列化_保存和局部校验、全局校验
    1.序列化字段类型合集(CharField可以通用):#1BooleanField BooleanField()#2NullBooleanField NullBooleanField()#3CharField CharField(max_length=None,m......