13.制造商资源,产品资源,ModelSerializer,模型序列化,VALID表级验证,字段级别验证

模型层

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")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值