You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django REST Framework开发学生注册校验业务逻辑需求

解决Django REST Framework中学生注册号码重复验证的问题

我来帮你实现要求的业务逻辑——检查学生姓名存在且已持有传入的注册号码时返回指定提示,同时修正现有代码里的问题。

核心思路说明

我们需要在序列化器中加入跨字段的自定义验证逻辑,在数据进入创建流程前完成检查;同时调整创建逻辑,避免未定义变量、重复创建数据这类问题。

修改后的完整代码实现

1. 序列化器(添加验证逻辑+修正创建流程)

from rest_framework import serializers
from .models import Student, RegistrationNumber
from django.core.exceptions import ObjectDoesNotExist

class AcademicMigrateSerializer(serializers.Serializer):
    name = serializers.CharField()
    registration_number = serializers.CharField()

    def validate(self, attrs):
        name = attrs.get('name')
        registration_number = attrs.get('registration_number')

        # 检查学生姓名是否存在
        try:
            student = Student.objects.get(name=name)
        except ObjectDoesNotExist:
            # 如果学生不存在,直接放行(若需求要求学生必须已存在,可在此抛出验证错误)
            return attrs

        # 检查该学生是否已持有传入的注册号码
        has_duplicate_reg = RegistrationNumber.objects.filter(
            student=student,
            registration_number=registration_number
        ).exists()

        if has_duplicate_reg:
            raise serializers.ValidationError("the student having the same registration number already exist")

        return attrs

    def create(self, validated_data):
        name = validated_data.get('name')
        registration_number = validated_data.get('registration_number')

        # 获取或创建学生(如果不允许创建新学生,可改为get并捕获异常抛出错误)
        student, _ = Student.objects.get_or_create(name=name)

        # 处理注册号码:存在则关联学生,不存在则创建并关联
        registration, reg_created = RegistrationNumber.objects.get_or_create(
            registration_number=registration_number,
            defaults={'student': student}
        )

        # 若注册号码已存在但未关联学生,更新关联关系
        if not reg_created and registration.student is None:
            registration.student = student
            registration.save()

        return registration

2. 视图类(补充完整配置)

from rest_framework.generics import CreateAPIView
from .serializers import AcademicMigrateSerializer

class AcademicMigrateCreateAPIView(CreateAPIView):
    serializer_class = AcademicMigrateSerializer

关键细节解释

  • 验证逻辑:通过validate方法提前完成两项检查,符合条件时抛出DRF标准的验证错误,自动返回400状态码和指定提示信息,更符合REST规范。
  • 创建逻辑:使用get_or_create避免重复创建学生或注册号码,同时处理了"注册号码已存在但未关联学生"的边界情况。
  • 可扩展性:如果你的需求是学生必须已存在(不允许创建新学生),只需把get_or_create改成get,并捕获ObjectDoesNotExist抛出对应的验证错误即可。

内容的提问来源于stack exchange,提问作者Lalliantluanga Hauhnar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:36:14