一.5.序列化应用之服务器制造厂与型号app功能
1.环境准备:
(python36env) [vagrant@CentOS7 apps]$ django-admin startapp manufacturer
(1)激活:'manufacturer.apps.ManufacturerConfig'
(2)模型:manufacturer/models.py
from django.db import models #制造厂表(一)
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="联系电话")
email = models.EmailField("联系邮件", null=True,blank=True,max_length=32, help_text="联系邮件")
remark = models.CharField("备注", max_length=300,null=True, help_text="备注")
def __str__(self):
return self.vendor_name
class Meta:
db_table = "resources_manufacturer"
ordering = ["id"] #型号表(多)--foreignkey放多中
class ProductModel(models.Model):
model_name = models.CharField("型号名称",max_length=20, help_text="型号名称")
vendor = models.ForeignKey(Manufacturer,verbose_name="所属制造商", help_text="所属制造商",on_delete=models.CASCADE)
def __str__(self):
return self.model_name
class Meta:
db_table = "resources_productmodel"
#排序
ordering = ["id"]
(python36env) [vagrant@CentOS7 devops]$ python manage.py makemigrations manufacturer
(python36env) [vagrant@CentOS7 devops]$ python manage.py migrate manufacturer
(3)序列化manufacturer/serializers.py:---使用的是模型序列化,所以所有字段的格式,数据类型可直接在模型中加
from rest_framework import serializers
from .models import Manufacturer, ProductModel
#ModelSerializer模型序列化和Serializer序列化的区别是:它有Meta选项,且它帮我们实现了create和update方法,不用再写
class ManufacturerSerializer(serializers.ModelSerializer): class Meta:
#指定它模型是哪个
model = Manufacturer
#序列化哪些字段
fields = "__all__" class ProductModelSerializer(serializers.ModelSerializer):
class Meta:
model = ProductModel
fields = "__all__"
(4)视图manufacturer/views.py:
from django.shortcuts import render
from rest_framework import viewsets
from .models import Manufacturer, ProductModel
from .serializers import ManufacturerSerializer,ProductModelSerializer class ManufacturerViewset(viewsets.ModelViewSet):
"""
retrieve:返回指定制造商信息
list:返回指定制造商列表
update:更新制造商信息
destroy:删除制造商记录
create:创建制造商记录
partial_update:更新部分字段
"""
#1.指定queryset
queryset = Manufacturer.objects.all()
#2.指定序列化类
serializer_class = ManufacturerSerializer class ProductModelViewset(viewsets.ModelViewSet):
"""
retrieve:返回指定制造商信息
list:返回指定制造商列表
update:更新制造商信息
destroy:删除制造商记录
create:创建制造商记录
partial_update:更新部分字段
"""
#1.指定queryset
queryset = ProductModel.objects.all()
#2.指定序列化类
serializer_class = ProductModelSerializer
(5)urls.py路由:
from django.conf.urls import include, url
from django.contrib import admin
from rest_framework.routers import DefaultRouter
from idcs.views import IdcViewset
from users.views import UserViewset
from cabinet.views import CabinetViewset
from manufacturer.views import ManufacturerViewset,ProductModelViewset
from rest_framework.documentation import include_docs_urls 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")
urlpatterns = [
url(r'^', include(route.urls)),
url(r'^docs/', include_docs_urls("lizhihua运维平台接口文档"))
]
效果如下几图



但是如下图中:

2.完善功能
(1)manufacturer/Serializer.py中class ProductModelSerializer类中可增加如下方法:
def to_representation(self, instance):
vendor = instance.vendor
ret = super(ProductModelSerializer, self).to_representation(instance)
ret["vendor"] = {
"id": vendor.id,
"name": vendor.vendor_name
}
return ret
最终效果如下图了:

但是上述效果中,你若再添加一戴尔的R710型号那模型中是可允许R710有重复的记录,但从业务逻辑上是不允许的, 所以此时就需要通过验证来解决这个问题----从业务层面上去处理这种验证关系--序列化中处理。
首先这里需要验证的是模型名称不能重复,只要它是个字符串在模型层面是可以重复的,但在业务层面不允许重复---两种方式:基于字段和基于模型去验证
https://www.django-rest-framework.org/api-guide/validators/#advanced-field-defaults----帮助文档
(2)manufacturer/Serializer.py中class ProductModelSerializer类中可增加如下方法:
class ProductModelSerializer(serializers.ModelSerializer):
class Meta:
model = ProductModel
fields = "__all__"
# #基于字段级别验证法:如把model_name字段转成大写--这只能是单个字段的,若要多个字段要用模型对象级别验证--表级别验证
# def validate_model_name(self, value):
# return value.upper()
#基于模型对象级别验证法:
def validate(self, attrs):
#取到数据
manufacturer_obj = attrs["vendor"]
try:
manufacturer_obj.productmodel_set.get(model_name__exact=attrs["model_name"])
raise serializers.ValidationError("该型号已经存在")
except ProductModel.DoesNotExist:
return attrs def to_representation(self, instance):
vendor = instance.vendor
ret = super(ProductModelSerializer, self).to_representation(instance)
ret["vendor"] = {
"id": vendor.id,
"name": vendor.vendor_name
}
return ret
一.5.序列化应用之服务器制造厂与型号app功能的更多相关文章
- 用C写一个web服务器(一) 基础功能
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- Android BLE与终端通信(四)——实现服务器与客户端即时通讯功能
Android BLE与终端通信(四)--实现服务器与客户端即时通讯功能 前面几篇一直在讲一些基础,其实说实话,蓝牙主要为多的还是一些概念性的东西,当你把概念都熟悉了之后,你会很简单的就可以实现一些逻 ...
- php+javascript实现的动态显示服务器运行程序进度条功能示例
本文实例讲述了php+javascript实现的动态显示服务器运行程序进度条功能.分享给大家供大家参考,具体如下: 经常有这样的业务要处理,服务器上有较多的业务需要处理,需要分批操作,于是就需要一个提 ...
- 免费API 接口罗列,再也不愁没有服务器开发不了APP了(下)【申明:来源于网络】
免费API 接口罗列,再也不愁没有服务器开发不了APP了(下)[申明:来源于网络] 地址:http://mp.weixin.qq.com/s/QzZTIG-LHlGOrzfdvCVR1g
- APP Inventor 基于网络微服务器的即时通信APP
APP Inventor 基于网络微服务器的即时通信APP 一.总结 一句话总结:(超低配版的QQ,逃~) 1.APP Inventor是什么? google 傻瓜式 编程 手机 app App In ...
- 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程
由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...
- php判断服务器是否支持Gzip压缩功能
Gzip可以压缩网页大小从而达到加速打开网页的速度,目前主流的浏览器几乎都支持这个功能,但开启Gzip是需要服务器支持的,在这里我们简单的使用php来判断服务器是否支持Gzip功能. 新建一个php类 ...
- Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”
在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求).本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊. 编译时,在后面加 ...
随机推荐
- Java实现 LeetCode 441 排列硬币
441. 排列硬币 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整 ...
- Java实现 蓝桥杯VIP 算法训练 采油区域
算法训练 采油区域 时间限制:2.0s 内存限制:512.0MB 提交此题 查看参考代码 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整 ...
- Java实现 蓝桥杯 历届试题 错误票据
问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成 ...
- java实现第八届蓝桥杯平方十位数
平方十位数 题目描述 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最小的一个平方数. 请你找出其中 ...
- MYSQL SQL 语句修改字段默认值
alter table tablename alter column drop default; (若本身存在默认值,则先删除) alter table tablename alter column ...
- Java学习之多线程详解
一.多线程的实现 1.继承Thread类 a.子类继承Thread类具备多线程能力 b.启动线程:子类对象.start() c.不建议使用:避免OOP单继承局限性 package com. ...
- 开发小白可以一年涨薪10w?这份java文档功不可没,学透你也可以
靠这份文档,跳槽涨薪10K 金九银十的时候我分享了一份面试文档给我的兄弟,没想到这哥们2个月之内斩获数个BAT的offer, 最后选择了一个他最想要去的公司,既然有这么好的效果,我就打算把这份文档分享 ...
- [TopCoder]Seatfriends
题目 点这里看题目. 分析 可以想到用 DP 解决. 由于把空位放到状态里面太麻烦了,因此我们单独将 " 组 " 提出来进行 DP . \(f(i,j)\):前\( ...
- 私有云nextcloud、seafile、syncthing的比较
可选 nextcloud.seafile.syncthing 1. seafile https://www.jianshu.com/p/43f570118e63 https://www.jianshu ...
- ZWave 中的消息队列机制
文章主题 在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁.高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的.这篇文章就来看看 ZWave 中是通过什 ...