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

Django中Competition模型生成唯一混合编码遇重复及全字母问题求助

问题分析与解决方案

核心问题原因

  1. 重复编码触发IntegrityError:你当前把default设为get_random_string(...)的执行结果,这会在models.py加载时仅生成一次字符串,所有新创建的Competition实例都会复用这个默认值,因此第二个实例会触发唯一约束冲突。
  2. 全字母编码:同样因为默认值只生成一次,若第一次生成的字符串恰好全为字母,后续实例都会使用该字符串,导致看起来所有编码都是字母(本质是随机概率问题,但因复用被放大)。

解决方案

修改代码,通过自定义生成函数确保每次创建实例时生成唯一且包含字母+数字的编码:

步骤1:导入必要模块

在models.py顶部补充导入:

import string
from django.utils.crypto import get_random_string
from django.db import IntegrityError

步骤2:定义编码生成函数

添加循环生成符合要求编码的函数:

def generate_ref_code():
    while True:
        # 生成10位由大写字母和数字组成的字符串
        code = get_random_string(10, allowed_chars=string.ascii_uppercase + string.digits)
        # 验证编码同时包含字母和数字
        has_letter = any(char.isalpha() for char in code)
        has_digit = any(char.isdigit() for char in code)
        if has_letter and has_digit:
            # 检查编码是否已存在于数据库
            try:
                Competition.objects.get(ref_code=code)
            except Competition.DoesNotExist:
                # 编码可用,返回
                return code
            # 编码已存在,继续循环生成新的

步骤3:更新模型字段

将ref_code字段的default改为函数引用(不要加括号):

class Competition(models.Model):
    name = models.CharField(max_length=100)
    location = models.CharField(max_length=50)
    no_of_rounds = models.IntegerField(validators= [MinValueValidator(1, message='Please enter a number greater than or equal to 1'), MaxValueValidator(30, message='Please enter a number less than or equal to 30')])
    gates_per_round = models.IntegerField(validators= [MinValueValidator(1), MaxValueValidator(30)])
    ref_code = models.CharField(
           max_length=10,
           blank=True,
           editable=False,
           unique=True,
           default=generate_ref_code  # 此处为函数引用,而非执行结果
    )

    def __str__(self):
        return self.name

说明

  • 函数中的while True循环会持续生成编码,直到找到同时包含字母和数字且未被数据库使用的编码,彻底避免重复和全字母问题。
  • 将default设为函数引用后,Django会在每次创建新Competition实例时自动调用该函数生成新编码,而非仅加载模型时生成一次。

内容的提问来源于stack exchange,提问作者f-gallagher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:34:58