模型层

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")

drf序列化器之反序列化的数据验证的更多相关文章

  1. drf序列化和反序列化

    目录 drf序列化和反序列化 一.自定义序列化 1.1 设置国际化 二.通过视图类的序列化和反序列化 三.ModelSerializer类实现序列化和反序列化 drf序列化和反序列化 一.自定义序列化 ...

  2. Jackson序列化和反序列化Json数据完整示例

    Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会 ...

  3. drf序列化与反序列化

    序列化器-Serializer 定义序列化器 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serial ...

  4. drf序列化及反序列化

    假如把drf看做一个汉堡包,我们之前讲的模块属于汉堡包前面的盖盖(请求模块.渲染模块)和底底(异常模块.解析模块.响应模块),但是真正中间的夹心没有讲,那么今天我就和大家来看一下汉堡包的夹心(序列化及 ...

  5. DRF序列化和反序列化(二:ModelSerializer)

    一: rest_framework 中 serializers.Serializer的不方便之处(以下简称Serializer) a:需要定义每一个字段,并且这个字段是和models字段及其类似. b ...

  6. [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  7. drf序列化器与反序列化

    什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 &qu ...

  8. DRF 序列化器-Serializer (2)

    作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...

  9. golang数据传输格式-序列化与反序列化

    golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...

  10. go语言之行--文件操作、命令行参数、序列化与反序列化详解

    一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...

随机推荐

  1. laravel groupBy 分页

    $model=DB::table('tablebname') ->where(function($query) use ($res){ $query->where('xx','xx'); ...

  2. 区块链技术与应用:02-BTC-密码学原理

    本文为个人整理笔记,知识点来源于北京大学肖臻老师的<区块链技术与应用>公开课视频:https://www.bilibili.com/video/BV1Vt411X7JF?from=sear ...

  3. 痞子衡嵌入式:我为2021 TencentOS Tiny AIoT应用创新大赛做了场直播培训

    TencentOS Tiny AIoT 应用创新大赛是腾讯 TencentOS 团队联合恩智浦半导体.安谋科技(Arm China)发起的线上开发者活动,主要面向中小企业嵌入式工程师.广大嵌入式开发者 ...

  4. 对于如何在IDEA中给Terminal添加git的详解

    具体步骤 1.配置本机环境变量 进入到环境变量的设置界面,然后找到下面的Path变量,双击点开: 然后新建一个变量,路径定义到git的目录下面的bin目录下: 2.WIN+R,然后输入cmd,进入终端 ...

  5. 再次打开Spring界面,多处报错

    分享一下经历 在我再次打开Srpring之后,打算解决一下"历史遗留问题",发现多处标红(挺崩溃的)! 就比如这句话,刚才就是不亮: 毕竟我上次的应用还是很顺利的,所以也就没有第一 ...

  6. SpringCloud Ribbon 负载均衡

    Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具.可以将面向服务的 REST 模板请求自动转化成客户端负载均衡的服务调用.Spring Cloud Rib ...

  7. 实现一个CRDT工具库——ORSet

    ORSet 这段代码实现了OR-Set,是一种基于版本向量的CRDT,用于实现集合的合并.OR-Set由两个集合add和remove组成,add集合存储添加的元素,remove集合存储删除的元素.每个 ...

  8. Javascript 加密解密方法

    本文链接 https://www.cnblogs.com/zichliang/p/17265960.html Javascript 和 我之前发的 python加密 以及 go加密 解密不一样 不需要 ...

  9. monggodb项目操作

    1.回顾 1.express + node 1.1 准备工作 前后端不分离开发 --- 前端负责写页面,后端负责渲染 --- admin-lte 1.2 创建express项目 express mya ...

  10. 准确率、召回率及AUC概念分析

    准确率&&召回率 信息检索.分类.识别.翻译等领域两个最基本指标是准确率(precision rate)和召回率(recall rate),准确率也叫查准率,召回率也叫查全率.这些概念 ...