在创建之前检查是否存在唯一值

时间:2011-05-08 18:18:25

标签: django django-models

当Django在主键属性上运行.save()时,它首先执行SELECT以查看它是否已存在,然后决定是执行INSERT还是更新。有没有办法优雅地为唯一但不是主键字段做同样的事情?

基本上,如果模型如下所示:

class Subject(models.Model):
    name = models.CharField(max_length=64, unique=True)

我想在不抛出错误的情况下执行以下操作

>>> s=Subject(name="A new subject")
>>> s.save()
>>> s
<Subject: A subject>
>>> s=Subject(name="A new subject")
>>> s.save()
--- django.db.utils.IntegrityError: column name is not unique

相反,我可以将'命名'命名为pk,但我不确定是否有一种优雅的Django方法来制作非pk独特的自动递增ID。

感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:25)

只需使用get_or_create

s, created = Subject.objects.get_or_create(name="A new subject")

答案 1 :(得分:2)

您可以覆盖该模型上的save方法,并检查您尝试保存的值是否已存在:

class Subject(models.Model):
     name = models.CharField(max_length=64, unique=True)

     def save(self, *args, **kwargs):
         #check if value exists / increment something etc

         #continue with save, if necessary:
         super(Subject, self).save(*args, **kwargs)

答案 2 :(得分:0)

`如果在模型中放置unique = True,当您尝试创建具有相同unique = True参数的对象时,将返回错误,因此请确保在try-except中调用它们以处理它。