존재하지 않는 경우 생성


81

웹 API에서 데이터를 읽고 데이터베이스에 저장하는 Django 애플리케이션이 있습니다.
모드에서 새 객체를 생성하지만 객체가 이미 존재하는 경우 중복 예외를 방지하는 방법이 있습니까?

즉, 객체를 저장하는 방법이 있지만 이미 존재하는 경우 아무 작업도하지 않는 것입니까?

답변:


161

9
문서에 대한 링크를 만들면 문자가 추가되고 더 나은 답변이 될 것 같습니다.
— 2

4
이것은 2 개의 쿼리를하는 것 같습니다. 객체가 존재하지 않는 경우에만 저장하고 싶다면 쿼리가 하나 뿐인 방법이 있습니까? 나는 IntegrityError현재 트랜잭션이 중단되는 원인을 잡아서 충분하지 않다고 생각합니다.
— Amir Ali Akbari

사용 세이브 포인트, 예를 추가하는 경우에는 무결성 오류를 잡을 수 있습니다 transaction.atomic당신이 잡을 수 있도록 ( 외부atomic 즉, 블록 try: with acomic: create; except IntegrityError그것은 당신이 잡을하지 않도록하는 것도 힘드 네요. 다른 당신이하려는 것보다 무결성 오류
— 초

을 잡을 수 있다면 IntegrityError, 내 테스트에 따르면 레코드가있는 경우에 비해 실행 시간이 거의 절반으로 줄어 듭니다 get_or_create().
— 론


3

최신 버전의 Django에서 save () 함수는 기본적으로 UPDATE 또는 INSERT를 수행하는 것처럼 보입니다. 를 참조하십시오 여기 .


자동으로 잘 선택되어야하는 것처럼 보이지만 내 db에서는 현재 스크립트를 실행하여 db를 채울 때마다 항목을 복제하고 있습니다.
— 마틴 - 마틴

save () 메서드는 모델의 PK에 값이 있는지 확인합니다. 작성자는이 기술을 사용하기 위해 올바른 PK로 모델 인스턴스를 가져 오기 위해 DB를 쿼리해야합니다. save ()의 유일한 사용은 마술을하지 않습니다.
— chickahoona

0

다음을 사용하여 달성 할 수 있습니다. Model.objects.get_or_create()

예

obj, created = Person.objects.get_or_create(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

get_or_create ()에 전달 된 모든 키워드 인수 (여기서는 first_name 및 last_name )는 선택 사항 인 defaults를 제외하고는 데이터베이스의 데이터베이스 (객체 찾기)를 쿼리하는 데 사용됩니다.

튜플을 반환하고 객체가 발견되면 get_or_create ()는 해당 객체의 튜플을 반환하고 False를 반환합니다.

참고 : try except명령문 을 사용하여 동일한 작업을 수행 할 수도 있습니다 .
예 :

try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
    obj.save()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.