这是我的模特
class Stockdata(models.Model):
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True,related_name='Company_stock')
quantity = models.PositiveIntegerField(null=True,blank=True,default=0)
rate = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
opening = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
stock_name = models.CharField(max_length=32)
我想使每个stock_name
的{{1}}唯一。
因此,我已执行以下操作:
company
但是当我尝试使用def clean(self):
if Stockdata.objects.filter(company=self.company,stock_name__iexact=self.stock_name).exists():
raise ValidationError({'stock_name':["This stock name already exists"]})
或save()
表单时,它会创建一个重复的值(即,它会创建一个在同一公司中已经存在的值)。
您知道如何执行此操作吗?
谢谢
答案 0 :(得分:2)
尝试
def clean_stock_name(self):
stock_name = self.cleaned_data['stock_name']
if Stockdata.objects.filter(company=self.company,stock_name__iexact=stock_name).exists():
raise ValidationError({'stock_name':["This stock name already exists"]})
return stock_name
希望有帮助
参考this
答案 1 :(得分:0)
我的建议是改用composed unique constraint:
class Meta:
unique_together = (('company', 'stock_name'), )
另外,来自docs:
但是请注意,就像Model.full_clean()一样,调用模型的save()方法时不会调用模型的clean()方法。
因此,您必须手动调用它。可以通过添加自定义mixin或具有以下功能的基类来“自动化”:
def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)