我有一个包含整数字段的模型
class myModel(models.Model):
number = models.IntegerField()
每当我向这个模型显示或输入数据时,我想以八进制的方式这样做。当我填充我的编辑表单时,我这样做:
number = oct(numberObject.number).replace('Oo','')
当我进入编辑表单时,它准确地预填充了我想要的但是当我在提交表单后尝试进行错误检查以避免出现该数字时出现两次我遇到问题因为数字在self.changed_data中因此我和#39; m得到这个号码已经存在的错误(基本上它已找到并说它是重复的)
我无法想出一种方法来弄清楚我是否正在尝试将数字更改为已存在的数字,或者我是否只是在不更改数字的情况下提交数字。
我的表单/验证码:
class NumberForm(ModelForm):
number = forms.CharField(max_length = 10)
def clean_number(self):
"""Ensures the new Number is unique
"""
enteredNumber = self.cleaned_data['number']
changedFields = self.changed_data
if number.objects.filter(number__exact = int(enteredNumber,8)):
if 'number' in changedFields:
raise forms.ValidationError("Error")
return int(enteredNumber,8)
class Meta:
model = Number
fields = '__all__'
答案 0 :(得分:1)
您可能正在编辑现有对象,对吗? 我只是将其从结果集中排除:
def clean_number(self):
"""Ensures the new Number is unique """
enteredNumber = int(self.cleaned_data['number'], 8)
queryset = Number.objects.filter(number=enteredNumber)
if self.instance is not None and self.instance.pk is not None:
queryset = queryset.exclude(pk=self.instance.pk)
if queryset.exists():
raise forms.ValidationError("Error")
return enteredNumber
使用.exists()
方法可以避免从数据库加载对象(如果存在)。
顺便说一句,此表单不会确保您无法创建重复项。两个线程可以同时运行验证代码,接受相同的值,然后继续使用该值保存其各自的对象。
如果您想确定没有重复项,则必须在数据库级别执行此操作(将unique=True
传递给模型上的字段)。