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功能的更多相关文章

  1. 用C写一个web服务器(一) 基础功能

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  2. javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  3. Android BLE与终端通信(四)——实现服务器与客户端即时通讯功能

    Android BLE与终端通信(四)--实现服务器与客户端即时通讯功能 前面几篇一直在讲一些基础,其实说实话,蓝牙主要为多的还是一些概念性的东西,当你把概念都熟悉了之后,你会很简单的就可以实现一些逻 ...

  4. php+javascript实现的动态显示服务器运行程序进度条功能示例

    本文实例讲述了php+javascript实现的动态显示服务器运行程序进度条功能.分享给大家供大家参考,具体如下: 经常有这样的业务要处理,服务器上有较多的业务需要处理,需要分批操作,于是就需要一个提 ...

  5. 免费API 接口罗列,再也不愁没有服务器开发不了APP了(下)【申明:来源于网络】

    免费API 接口罗列,再也不愁没有服务器开发不了APP了(下)[申明:来源于网络] 地址:http://mp.weixin.qq.com/s/QzZTIG-LHlGOrzfdvCVR1g

  6. APP Inventor 基于网络微服务器的即时通信APP

    APP Inventor 基于网络微服务器的即时通信APP 一.总结 一句话总结:(超低配版的QQ,逃~) 1.APP Inventor是什么? google 傻瓜式 编程 手机 app App In ...

  7. 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程

    由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...

  8. php判断服务器是否支持Gzip压缩功能

    Gzip可以压缩网页大小从而达到加速打开网页的速度,目前主流的浏览器几乎都支持这个功能,但开启Gzip是需要服务器支持的,在这里我们简单的使用php来判断服务器是否支持Gzip功能. 新建一个php类 ...

  9. Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”

    在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求).本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊. 编译时,在后面加 ...

随机推荐

  1. Java实现 LeetCode 715 Range 模块(选范围)

    715. Range 模块 Range 模块是跟踪数字范围的模块.你的任务是以一种有效的方式设计和实现以下接口. addRange(int left, int right) 添加半开区间 [left, ...

  2. Java实现 LeetCode 633 平方数之和(暴力大法)

    633. 平方数之和 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 ...

  3. Java实现 蓝桥杯VIP 基础练习 芯片测试

    问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏.而用坏芯片测试其他芯片时,会随机给出好或是 ...

  4. Java实现蓝桥杯模拟组织晚会

    问题描述 小明要组织一台晚会,总共准备了 n 个节目.然后晚会的时间有限,他只能最终选择其中的 m 个节目. 这 n 个节目是按照小明设想的顺序给定的,顺序不能改变. 小明发现,观众对于晚上的喜欢程度 ...

  5. Java实现蓝桥杯算法提高12-2扑克排序

    扑克牌排序 问题描述 扑克牌排序:构造扑克牌数组,对扑克牌进行排序. 排序原则如下:数字从小到大是2-10.J.Q.K和A,花色从小到大是方块(diamond).梅花(club).红桃(heart). ...

  6. Java实现 洛谷 P1487 陶陶摘苹果(升级版)

    题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力 ...

  7. java实现SPFA算法

    1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其 ...

  8. redis基础知识详解

    一.redis基础知识 1.Redis是什么Redis是一个开源的key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  9. Layui 实现一个高级筛选功能

    基于layui写的一个高级搜索(筛选)功能.效果图: 是一位萌新,所有写的有点儿乱.(放在上面,供新手们参考,也是自己做一个记录.)代码如下: <!DOCTYPE html PUBLIC &qu ...

  10. Fibonacci(模板)【矩阵快速幂】

    Fibonacci 题目链接(点击) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20989   Accepted: 14 ...