如何使用django查询在clean函数中运行验证错误?

如何使用django查询在clean函数中运行验证错误?,django,django-models,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

这是我的模型:

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)
我想让每个
公司的
股票名称
都是唯一的。 因此,我做了以下工作:

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

你知道怎么做吗

谢谢

我的建议是改用a:

此外,从:

但是,请注意,与Model.full_clean()类似,在调用模型的save()方法时,不会调用模型的clean()方法

因此,您必须手动调用它。可以通过添加自定义mixin或具有如下功能的基类来“自动”实现:

def save(self, *args, **kwargs):
     self.full_clean()
     super().save(*args, **kwargs)
试试这个

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
希望能有帮助


请参阅

如果错误消息不是唯一的,如何引发错误消息。我想向用户显示错误消息。
unique\u一起
将为您完成所有工作。如果您不想要它-请参阅代码示例和有关clean method的文档链接。我不明白您在何处以及如何接收404。实际上,它将我重定向到错误页面,并在调试设置为
False
时向我发送
错误
消息。我想以相同的形式显示
验证错误
消息。什么是重定向
unique_together
与重定向无关。请使用修改后的代码和错误消息文本更新您的问题。我现在收到此错误
当错误参数包含多个字段的错误时,参数字段必须为无。
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