developer tip

Django 모델 생성 또는 존재하는 경우 업데이트

copycodes 2020. 8. 24. 18:53
반응형

Django 모델 생성 또는 존재하는 경우 업데이트


사람의 ID가 존재하지 않는 경우 Person과 같은 모델 개체를 만들고 싶습니다. 그렇지 않으면 해당 사람 개체를 가져옵니다.

다음과 같이 새 사람을 만드는 코드 :

class Person(models.Model):
    identifier = models.CharField(max_length = 10)
    name = models.CharField(max_length = 20)
    objects = PersonManager()

class PersonManager(models.Manager):
    def create_person(self, identifier):
        person = self.create(identifier = identifier)
        return person

그러나 나는 기존 사람 객체를 어디에서 확인하고 얻을지 모릅니다.


"존재하는 경우 업데이트가 아니면 생성"사용 사례를 찾고 있다면 @Zags 우수한 답변을 참조하십시오.


장고는 이미있다 get_or_create, https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

당신을 위해 그것은 될 수 있습니다 :

id = 'some identifier'
person, created = Person.objects.get_or_create(identifier=id)

if created:
   # means you have created a new person
else:
   # person just refers to the existing one

귀하의 질문이 get_or_create 메소드 (최소 Django 1.3에서 사용 가능) 또는 update_or_create 메소드 (Django 1.7에서 새로 추가됨 )를 요청하는지 여부는 불분명합니다 . 사용자 개체를 업데이트하려는 방법에 따라 다릅니다.

샘플 사용은 다음과 같습니다.

# In both cases, the call will get a person object with matching
# identifier or create one if none exists; if a person is created,
# it will be created with name equal to the value in `name`.

# In this case, if the Person already exists, its existing name is preserved
person, created = Person.objects.get_or_create(
        identifier=identifier, defaults={"name": name}
)

# In this case, if the Person already exists, its name is updated
person, created = Person.objects.update_or_create(
        identifier=identifier, defaults={"name": name}
)

Django는이를 지원합니다. get_or_create를 확인 하십시오.

person, created = Person.objects.get_or_create(name='abc')
if created:
    # A new person object created
else:
    # person object already exists

질문 제목이 질문 본문에 설명 된대로 가져 오거나 생성하는 것이 아니라 생성 또는 업데이트 방법을 묻는 것처럼 보이기 때문에 답변을 추가 할 것이라고 생각했습니다.

객체를 만들거나 업데이트하려는 경우 .save () 메서드는 이미 문서 에서이 동작을 기본적으로 가지고 있습니다 .

Django는 INSERT 또는 UPDATE SQL 문을 사용해야하는 필요성을 추상화합니다. 특히 save ()를 호출하면 Django는 다음 알고리즘을 따릅니다.

객체의 기본 키 속성이 True로 평가되는 값 (즉, None 또는 빈 문자열 이외의 값)으로 설정되면 Django는 UPDATE를 실행합니다. 객체의 기본 키 속성이 설정되지 않았거나 UPDATE가 아무것도 업데이트하지 않은 경우 Django는 INSERT를 실행합니다.

It's worth noting that when they say 'if the UPDATE didn't update anything' they are essentially referring to the case where the id you gave the object doesn't already exist in the database.


If one of the input when you create is a primary key, this will be enough:

Person.objects.get_or_create(id=1)

It will automatically update if exist since two data with the same primary key is not allowed.


For only a small amount of objects the update_or_create works well, but if you're doing over a large collection it won't scale well. update_or_create always first runs a SELECT and thereafter an UPDATE.

for the_bar in bars:
    updated_rows = SomeModel.objects.filter(bar=the_bar).update(foo=100)
        if not updated_rows:
            # if not exists, create new
            SomeModel.objects.create(bar=the_bar, foo=100)

This will at best only run the first update-query, and only if it matched zero rows run another INSERT-query. Which will greatly increase your performance if you expect most of the rows to actually be existing.

It all comes down to your use case though. If you are expecting mostly inserts then perhaps the bulk_create() command could be an option.

참고URL : https://stackoverflow.com/questions/14115318/create-django-model-or-update-if-exists

반응형