2011-05-08 138 views
11

当Django在主键属性上运行.save()时,它首先执行SELECT以查看它是否已经存在,然后决定是执行INSERT还是UPDATE。有没有一种方法来优雅地做一个独特的,但不是主键字段?在创建它之前检查是否存在唯一值

基本上,如果模型是这样的:

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,但我不确定使用非Dj的优雅方式来创建非pk独特的自动递增ID。

任何帮助表示赞赏。谢谢!

回答

22

只需使用get_or_create

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

您可以覆盖保存在该模型的方法和检查,如果你试图保存已经值存在:

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) 
+0

但[不要尝试](https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-objects)使用模型管理器('self.objects.filter .. 。)从模型实例中。你必须做'Subject.objects.filter ...' – hobs 2013-05-17 22:29:33

0

`如果你把唯一= true在你的模型中,当您尝试创建具有相同的唯一= True参数的对象,错误将返回,所以一定要确保你叫他们在尝试 - 除了来处理。

相关问题