존재하지 않는 경우 생성


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