2011-05-08 15 views
11

Django bir birincil anahtar özniteliğinde .save() çalıştırdığında, önce var olup olmadığını görmek için önce bir SELECT yapar, sonra bir INSERT veya UPDATE yapıp yapmayacağınıza karar verir. Benzersiz değil, birincil anahtar alan için de aynısını aynen yapmanın bir yolu var mı?Oluşturmadan önce benzersiz bir değer olup olmadığını kontrol edin

Temelde, modeli aşağıdaki gibiyse:

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

ben 'adını' pk, yapabiliriz,

>>> 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 

Tersine bir hata atma olmadan aşağıdakileri yapmak isteyebilirsiniz ama Pk olmayan benzersiz otomatik artışlı kimlikler yapmak için zarif bir Django yolu emin değildim.

Herhangi bir yardım için teşekkür ederiz. Teşekkür ederim!

cevap

22

Sadece get_or_create kullanın.

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

Sen zaten kurtarmaya çalışıyoruz değeri varsa o modele yöntemi kaydedebilir ve kontrol geçersiz kılabilirsiniz:

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

Ama model yöneticisini kullanmak için [denemeyin] (https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-objects) ('self.objects.filter .. .') model örneğinden. Subject.objects.filter ... 'i yapmak zorundasınız – hobs

0

`Eğer modelinde Doğru = benzersiz koyarsanız aynı benzersiz = true parametresini içeren bir nesne oluşturmak çalıştığınızda, hata döndürdü, bu yüzden onları aramak emin olacağı işlemek için deneyin-hariç .

İlgili konular