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 421 数组中两个数的最大异或值

    421. 数组中两个数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算 ...

  2. Java实现 LeetCode 290 单词规律

    290. 单词规律 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...

  3. Java实现 蓝桥杯VIP 算法训练 邮票

    算法训练 邮票 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个信封,有N(1≤N≤100)个位置可以贴邮票,每个位置只能贴一张邮票.我们现在有M(M<=100)种不同邮资的邮票 ...

  4. Java实现 LeetCode 130 被围绕的区域

    130. 被围绕的区域 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O ...

  5. Java实现 LeetCode 81 搜索旋转排序数组 II(二)

    81. 搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判 ...

  6. Java实现 LeetCode 25 K个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  7. Java实现 蓝桥杯 历届试题 小朋友排队

    问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友 ...

  8. js事件的一些兼容写法

    事件兼容 事件对象的兼容 获取键码兼容 默认行为兼容 阻止事件冒泡兼容 事件监听兼容 ---- 封装 删除事件监听兼容 ---- 封装 事件委托->获取事件源兼容

  9. vs2019离线下载安装包

    官方的离线安装说明-->点击打开 1.下载 vs2019引导程序 ,选择你所需的版本下载,我选择了企业版 vs_enterprise__184447765.1558180718.exe 2.设置 ...

  10. 练习C++的vector语法-约瑟夫问题

    //测试vector,约瑟夫问题 #include <iostream> #include <vector> using namespace std; int main() { ...