웹 API에서 데이터를 읽고 데이터베이스에 저장하는 Django 애플리케이션이 있습니다.
모드에서 새 객체를 생성하지만 객체가 이미 존재하는 경우 중복 예외를 방지하는 방법이 있습니까?
즉, 객체를 저장하는 방법이 있지만 이미 존재하는 경우 아무 작업도하지 않는 것입니까?
웹 API에서 데이터를 읽고 데이터베이스에 저장하는 Django 애플리케이션이 있습니다.
모드에서 새 객체를 생성하지만 객체가 이미 존재하는 경우 중복 예외를 방지하는 방법이 있습니까?
즉, 객체를 저장하는 방법이 있지만 이미 존재하는 경우 아무 작업도하지 않는 것입니까?
답변:
IntegrityError
현재 트랜잭션이 중단되는 원인을 잡아서 충분하지 않다고 생각합니다.
transaction.atomic
당신이 잡을 수 있도록 ( 외부atomic
즉, 블록 try: with acomic: create; except IntegrityError
그것은 당신이 잡을하지 않도록하는 것도 힘드 네요. 다른 당신이하려는 것보다 무결성 오류
IntegrityError
, 내 테스트에 따르면 레코드가있는 경우에 비해 실행 시간이 거의 절반으로 줄어 듭니다 get_or_create()
.
최신 버전의 Django에서 save () 함수는 기본적으로 UPDATE 또는 INSERT를 수행하는 것처럼 보입니다. 를 참조하십시오 여기 .
다음을 사용하여 달성 할 수 있습니다. 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()