如何使用Django查询在纯净功能中运行验证错误?

时间:2019-05-24 12:17:59

标签: django django-models

这是我的模特

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()表单时,它会创建一个重复的值(即,它会创建一个在同一公司中已经存在的值)。

您知道如何执行此操作吗?

谢谢

2 个答案:

答案 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)