尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

重复数据如何拒之门外?django-rest-framework-mongoengine唯一索引校验UniqueValidator详解

重复数据如何拒之门外?django-rest-framework-mongoengine唯一索引校验UniqueValidator详解 重复数据如何拒之门外django-rest-framework-mongoengine唯一索引校验UniqueValidator详解【免费下载链接】django-rest-framework-mongoengineMongoengine support for Django Rest Framework项目地址: https://gitcode.com/gh_mirrors/dj/django-rest-framework-mongoenginedjango-rest-framework-mongoengine是为 Django Rest FrameworkDRF提供 Mongoengine 支持的开源项目让你用 MongoDB 搭建 API 时也能像使用 Django ORM 一样方便。它的UniqueValidator校验器能在数据入库前拦截重复值把重复数据拒之门外避免用户名已存在这类脏数据污染你的数据库。为什么需要 UniqueValidator在 MongoDB 场景下数据校验不能只依赖数据库唯一索引错误信息不友好直接撞库会抛出底层的DuplicateKeyError而不是 DRF 风格的字段级校验错误无法区分新增与更新更新一条文档时自己不应算作冲突多字段联合唯一单字段不重复但name code组合重复需要联合校验UniqueValidator正是为解决这些问题而设计它位于项目的 rest_framework_mongoengine/validators.py 文件中。DocumentSerializer 如何自动挂载校验器好消息是在大多数情况下你什么都不用写。项目核心的DocumentSerializer位于rest_framework_mongoengine/serializers.py会读取 Mongoengine 模型的元数据自动完成两件事单字段唯一如果你的模型字段声明了uniqueTrue序列化器会自动为该字段附加一个UniqueValidator组合唯一如果模型meta.indexes中定义了多字段联合唯一索引且这些字段都在序列化器中则自动附加UniqueTogetherValidator一个典型的模型定义如下from mongoengine import Document, fields class User(Document): username fields.StringField(uniqueTrue) # 自动触发 UniqueValidator email fields.StringField() meta { indexes: [ {fields: [email, username], unique: True} # 自动触发联合校验 ] }之后只要用DocumentSerializer声明Meta.model User校验器就自动就位创建和更新接口都会生效。UniqueValidator 的三步校验流程无论显式还是隐式使用UniqueValidator的__call__方法见rest_framework_mongoengine/validators.py都会按以下三步工作步骤动作说明① 定位字段serializer_field.source_attrs[-1]即使字段设置了source改名也能找到真实的模型字段名② 排除自身exclude_current_instance更新操作时把当前文档从查询中剔除避免自己和自己冲突③ 查重判定queryset.first()只要库里存在一条匹配记录立即抛出ValidationError其中排除当前实例是最关键的一步——否则你修改一条记录的其他字段时会因为自己的username已被自己占用而校验失败。手动添加校验显式使用 UniqueValidator当模型字段没有声明uniqueTrue例如索引在数据库层手动创建你仍可在序列化器中显式声明from rest_framework import serializers from rest_framework_mongoengine.serializers import DocumentSerializer from rest_framework_mongoengine.validators import UniqueValidator class UserSerializer(DocumentSerializer): username serializers.CharField( validators[UniqueValidator(querysetUser.objects)] ) class Meta: model User fields __all__校验失败时API 会返回标准的 DRF 错误格式{username: [This field must be unique.]}多字段联合校验UniqueTogetherValidator对于组合唯一需求如同一用户名下不能有重复邮箱使用UniqueTogetherValidator并在Meta.validators中注册class Meta: model User fields (username, email) validators [ UniqueTogetherValidator( querysetUser.objects, fields(email, username) ) ]它有两个贴心细节任一字段为 None 时跳过校验避免误伤允许空值的字段字段缺失会报This field is required.保证联合约束的完整性此外项目还提供了OptionalUniqueTogetherValidator当所有校验字段都缺失时典型如 PATCH 部分更新直接放行非常适合处理 partial 数据。3 个容易踩的坑lookup默认值Mongoengine 中精确匹配就是普通查询因此该项目的UniqueValidator把lookup默认值设为空字符串与 DRF 原生不同这是刻意修复过的行为EmbeddedDocument 不参与唯一校验EmbeddedDocumentSerializer会跳过 id 字段和唯一性校验内嵌文档没有独立主键这是符合预期被排除的字段不会触发校验如果联合唯一索引中的某个字段没出现在序列化器里该索引的校验器就不会被自动挂载——请确保相关字段都在Meta.fields中小结uniqueTrue的字段 →DocumentSerializer自动挂载UniqueValidator联合唯一索引 →自动挂载UniqueTogetherValidator模型未声明唯一约束 → 在序列化器中显式添加校验器校验测试可参考 tests/test_validators.py 中的完整用例覆盖新增、更新、部分更新和空值场景掌握UniqueValidator后你的 MongoDB API 就能在数据写入前就拦截重复数据让接口错误信息更专业、数据质量更可靠。【免费下载链接】django-rest-framework-mongoengineMongoengine support for Django Rest Framework项目地址: https://gitcode.com/gh_mirrors/dj/django-rest-framework-mongoengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表