ModelSerializer字段验证的扩展操作

def validate_字段名(self, value),单一字段校验

from rest_framework import serializers
from rest_framework import exceptions
from .. import models

class BidModelSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.nickname', read_only=True)
    status_text = serializers.CharField(source='get_status_display', read_only=True)

    class Meta:
        model = models.BidRecord
        exclude = ['user', 'status', ]

    def validate_item(self, value):
        """ 验证是否还正在拍卖"""
        item_id = self.initial_data.get('item')
        exists = models.AuctionItem.objects.filter(id=item_id, status=3).exists()
        if not exists:
            raise exceptions.ValidationError('拍卖商品不存在或已成交')
        return value

    def validate_price(self, value):
        """ 验证价格
        1. 比最大的要大
        2. 是单元的倍数
        """
        from django.db.models import Max
        item_id = self.initial_data.get('item')
        item_object = models.AuctionItem.objects.filter(id=item_id).first()
        if value < item_object.start_price:
            raise exceptions.ValidationError('出价不能低于低价')
        result = models.BidRecord.objects.filter(item_id=item_id).aggregate(max_price=Max('price'))
        if not result['max_price']:
            return value
        if value <= result['max_price']:
            raise exceptions.ValidationError('已有出价更高者,请调整出价')
        return value

重构create方法

'''
这里应用了Serializer与ModelSerializer的结合使用

'''
class CreateNewsTopicModelSerializer(serializers.Serializer):
    key = serializers.CharField()
    cos_path = serializers.CharField()

class CreateNewsModelSerializer(serializers.ModelSerializer):
    imageList = CreateNewsTopicModelSerializer(many=True)

    class Meta:
        model = models.News
        exclude = ['user', 'viewer_count', 'comment_count']

    def create(self, validated_data):
        image_list = validated_data.pop('imageList')
        news_object = models.News.objects.create(**validated_data)
        data_list = models.NewsDetail.objects.bulk_create(
            [models.NewsDetail(**info, news=news_object) for info in image_list]
        )
        news_object.imageList = data_list
        if news_object.topic:
            models.Topic.objects.filter(id=news_object.topic_id).update(count=F('count') + 1)
        return news_object

        

自定义字段,获取一张表的全部内容

'''
此处涉及到两个ModelSerializer类

# 保证金
deposit = serializers.SerializerMethodField()

def get_deposit(self, obj):
    return PayDepositModelSerializer(instance=obj.deposit).data

'''

class PayDepositModelSerializer(serializers.ModelSerializer):

    # 支付保证金
    deposit_text = serializers.CharField(source='get_deposit_type_display')
    checked = serializers.BooleanField(default=False)

    class Meta:
        model = models.Collateral
        fields = ['id', 'deposit_type', 'deposit_text', 'amount', 'balance', 'checked']

class PayModelSerializer(serializers.ModelSerializer):

    user_balance = serializers.IntegerField(source='user.balance')

    auction = serializers.CharField(source='lot.special_auction_id')

    # 拍品
    lot = serializers.SerializerMethodField()

    # 保证金
    deposit = serializers.SerializerMethodField()

    # 是否有优惠券
    coupon = serializers.SerializerMethodField()

    # 支付方式
    pay_method = serializers.SerializerMethodField()

    class Meta:
        model = models.Order
        exclude = ['uid', 'twenty_four_task_id', 'user']

    def get_deposit(self, obj):
        return Pay DepositModelSerializer(instance=obj.deposit).data

    def get_coupon(self, obj):
        user_object = self.context['request'].user
        exists = models.UserCoupon.objects.filter(
            user=user_object, status=1, coupon__auction=obj.lot.special_auction_id).exists()

        context = {
            'id': None,
            'has': exists,
            'text': '请选择优惠券' if exists else '无',
            'money': 0
        }
        return context

    def get_pay_method(self, obj):
        balance = self.context['request'].user.balance
        info = {
            'selected': 1,
            'choices': [
                {'id': 1, 'text': '余额(%s)' % balance},
                {'id': 2, 'text': '微信支付'},
            ]
        }
        return info

    def get_lot(self, obj):
        return {
            'title': obj.lot.name,
            'cover': obj.lot.cover.name,
            'uid': obj.lot.catalog_num
        }

        

原文地址:https://www.cnblogs.com/daviddd/p/12411207.html

时间: 2024-08-30 13:46:48

ModelSerializer字段验证的扩展操作的相关文章

[原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Struts(二十四):短路验证&amp;重写实现转换验证失败时短路&amp;非字段验证

短路验证: 若对一个字段使用多个验证器,默认情况下会执行所有的验证.若希望前面的验证器没有通过,后面的验证器就不再执行,可以使用短路验证. 1.如下拦截器,如果输入字符串,提交表单后,默认是会出现三个错误:字段转换失败.conversion验证失败.取值范围失败. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds

Struts2的输入验证(三)-短路验证与非字段验证

一.短路验证 若对一个字段使用多个验证器,默认情况下会执行所有的验证.若希望前面的验证器验证没有通过,后面的就不再验证,可以使用短路验证. 1)对同一个字段内的多个验证器,如果一个短路验证器验证失败,其他验证器不会继续校验 2)验证程序配置文件中<validator  …/> 元素和 <field-validator  …/> 元素可以指定一个可选的 short-circuit 属性,该属性指定该验证器是否是短验证器,默认值为 false. 1.示例:短路验证器 要求:为age字段

[ASP.NET MVC]如何定制Numeric属性/字段验证消息

原文:[ASP.NET MVC]如何定制Numeric属性/字段验证消息 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字,但是呈现在页面上的错误消息总是一段固定的文本:“The field {0} must be a number”,本篇提供一种解决方案使我们可以对此验证消息进行定制.[源代码从这里下载] 目录 一.针对Numeric属性/字段默认验证消息 二.默认的验证消息来源于何处? 三.通过自定义ModelVal

Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)

Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. 约束功能 为了防止用户输入不合法的数据,我们可以使用约束功能来限制用户的输入,例如TextField的 MinLength/MaxLength,NumberField的MinValue/MaxValue,DateField的MinDate /MaxDate等属性,它们可以将用户输入的值限定在一个合

SpringMVC利用Hibernate validator做字段验证

1.添加Hiberbate validator相关的jar包 2.字需要验证的formbean 上添加验证的注解,内置注解有: dBean Validation 中内置的 constraint @Null   被注释的元素必须为 null @NotNull    被注释的元素必须不为 null @AssertTrue     被注释的元素必须为 true @AssertFalse    被注释的元素必须为 false @Min(value)     被注释的元素必须是一个数字,其值必须大于等于指

html字段验证

(1)连接去掉下划线:style="text-decoration:none" <a href="/example/html/lastpage.html" style="text-decoration:none"> 这是一个链接! </a> (2)文本框输入时提示曾经输入过的内容:autocomplete="on",不提示则:autocomplete="off" autocomple

【DRF框架】序列化组件——字段验证

单个字段的验证 1.在序列化器里定义校验字段的钩子方法   validate_字段 2.获取字段的数据 3.验证不通过,抛出异常  raise serializers.ValidationError("校验不通过的说明") 4.验证通过,直接返回字段数据 # 对title字段进行验证 def validate_title(self,value): # 判断value是否含有敏感字段 if "xx" in value: # 存在敏感字段,抛出异常并附上自定义的原因 r

Bind[Exclude|Include]排除字段或只允许字段验证

1 public ActionResult xx([Bind(Exclude = "id")] xxModel xx, HttpPostedFileBase file)//排除id验证 2 3 //Bind(Include="name,age") 只允许name和age验证 ModelState.Remove("Name")//另一种排除验证方式