Django开发中如何避免数据库Complex字段生成重复条目
解决方案
你可以从三个层级实现重复校验,优先推荐模型层添加唯一约束,从底层避免脏数据产生:
方案1:模型层添加唯一约束(最推荐)
直接在SettingsClass模型的Complex字段添加unique=True属性,数据库层面会直接阻止重复值插入,同时Django表单也会自动触发对应的校验逻辑:
class SettingsClass(models.Model): # 仅需添加unique=True参数即可,其余配置保持不变 Complex = models.CharField(choices=complex_list , max_length = 15 ,default='1', unique=True) Trial_balance_Year_to_date= models.BooleanField(default = False) Trial_balance_Monthly=models.BooleanField(default = False) Income_Statement_Year_to_date=models.BooleanField(default = False) Income_Statement_Monthly=models.BooleanField(default = False) Age_Analysis=models.BooleanField(default = False) Balance_Sheet=models.BooleanField(default = False) Repair_and_Maintenance_General_Ledger=models.BooleanField(default = False) Mayor_capital_Items_General_Ledger=models.BooleanField(default = False) def __str__(self): return (self.Complex + ' Settings')
注意:如果当前数据库中已经存在重复的
Complex值,需要先手动清理重复数据,再执行python manage.py makemigrations和python manage.py migrate命令完成字段更新,否则迁移会执行失败。
添加后提交重复值时,表单的is_valid()方法会自动返回False,并生成对应的错误提示,你只需在模板中渲染错误信息即可。
方案2:表单层自定义校验(适合不想修改模型的场景)
如果不想改动模型结构,可以在表单类中添加自定义校验方法,提交时自动校验Complex是否重复:
from django import forms from django.core.exceptions import ValidationError from .models import SettingsClass class SettingsForm(forms.ModelForm): class Meta: model = SettingsClass # 保持你原本的fields配置不变即可 fields = "__all__" # 自定义Complex字段的校验逻辑 def clean_Complex(self): complex_val = self.cleaned_data.get('Complex') if SettingsClass.objects.filter(Complex=complex_val).exists(): raise ValidationError("该Complex对应的配置已存在,请勿重复提交") return complex_val
方案3:视图层临时校验(仅适合临时快速修改的场景)
如果不想改动表单和模型,也可以直接在视图逻辑中添加校验:
def newSetting(request): form = SettingsForm() if request.method == 'POST': form = SettingsForm(request.POST) if form.is_valid(): submitted_complex = form.cleaned_data.get('Complex') # 校验是否已存在相同值 if SettingsClass.objects.filter(Complex=submitted_complex).exists(): form.add_error('Complex', '该Complex对应的配置已存在,请勿重复提交') else: form.save() return render(request , 'main/newSetting.html' , {'form':form})
补充:模板添加错误提示
在newSetting.html的Complex字段渲染位置添加错误展示代码,用户提交重复值时可以看到明确提示:
{% csrf_token %} {{ form.Complex }} <!-- 新增错误提示部分 --> {% if form.Complex.errors %} <div class="text-danger mt-1"> {% for error in form.Complex.errors %} <p>{{ error }}</p> {% endfor %} </div> {% endif %} <br> <br> <!-- 其余原有代码保持不变 -->
内容的提问来源于stack exchange,提问作者KyleStranger
相关产品推荐
相关产品推荐

