2011-05-08 3 views
11

Django가 기본 키 특성에서 .save()를 실행하면 먼저 SELECT를 수행하여 이미 존재하는지 확인한 다음 INSERT 또는 UPDATE를 수행할지 여부를 결정합니다. 고유하지만 기본 키 필드가 아니라 우아하게 동일한 작업을 수행 할 수있는 방법이 있습니까?생성하기 전에 유일한 값이 있는지 확인

기본적으로 모델은 다음과 같습니다 경우 :

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

내가 '이름'은 PK를 만들 수,

>>> 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 고유의 자동 증가 형 ID를 만드는 우아한 Django 방법에 대해 확신하지 못했습니다.

도움을 주시면 감사하겠습니다. 고맙습니다!

답변

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

하지만 모델 관리자 ('self.objects.filter .. ')를 사용하려면 [https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-objects]를 시도하지 마십시오. .') 모델 인스턴스 내에서. 당신은'Subject.objects.filter ...'를해야 할 것입니다. – hobs

0

`당신이 모델의 진정한 = 고유 넣을 경우 동일한 고유 = true 매개 변수를 사용하여 개체를 만들려고 할 때, 오류가 반환, 그래서 당신이 그들에게 전화 있는지 확인 것을 처리하기 위해 예외 처리 .

관련 문제