当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。
感谢任何帮助。谢谢!
答案 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中调用它们以处理它。