Django 모델 생성 또는 업데이트(있는 경우)
사용자의 ID가 존재하지 않는 경우 사용자와 같은 모델 개체를 만들고 싶습니다. 그렇지 않으면 사용자 개체를 가져옵니다.
새 사용자를 생성하는 코드는 다음과 같습니다.
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
그런데 어디서 기존 사람 물건을 확인하고 받아야 할지 모르겠습니다.
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}
)
"존재하는 경우 업데이트" 사용 사례를 찾고 있다면 @Jags 훌륭한 답변을 참조하십시오.
장고는 이미 가지고 있습니다.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
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
적은 양의 개체에 대해서만 update_or_create가 잘 작동하지만, 많은 양의 컬렉션을 초과하는 경우에는 확장이 잘 되지 않습니다.update_or_create는 항상 먼저 선택을 실행한 다음 업데이트를 실행합니다.
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)
이렇게 하면 첫 번째 업데이트 쿼리만 실행되고 0개 행과 일치하는 경우에만 다른 INSERT 쿼리를 실행합니다.대부분의 행이 실제로 존재할 것으로 예상되는 경우 성능이 크게 향상됩니다.
하지만 이 모든 것은 사용 사례로 귀결됩니다.대부분 삽입이 예상되는 경우 bulk_create() 명령이 옵션일 수 있습니다.
질문 제목이 질문 본문에 설명된 대로 가져오거나 만드는 것이 아니라 작성하거나 업데이트하는 방법을 묻는 것처럼 보이기 때문에 답변을 추가하려고 합니다.
개체를 생성하거나 업데이트하려는 경우 .save() 메서드는 다음 문서에서 기본적으로 이미 다음 동작을 수행합니다.
Django는 INSERT 또는 UPDATE SQL 문을 사용할 필요성을 추상화합니다.특히 save()를 호출하면 장고는 다음 알고리즘을 따릅니다.
개체의 기본 키 특성이 True로 평가되는 값(예: 없음 또는 빈 문자열 이외의 값)으로 설정된 경우 Django는 UPDATE를 실행합니다.개체의 기본 키 속성이 설정되지 않았거나 업데이트가 아무것도 업데이트하지 않은 경우 Django는 INSERT를 실행합니다.
업데이트가 아무것도 업데이트하지 않은 경우'라고 말할 때는 기본적으로 개체에 지정한 ID가 데이터베이스에 이미 존재하지 않는 경우를 의미합니다.
get_or_create와 마찬가지로 update_or_create를 사용할 수도 있습니다. 여기에 ID(키), 이름, 나이, is_manager를 속성으로 가정한 update_or_create 패턴이 있습니다.
update_values = {"is_manager": False}
new_values = {"name": "Bob", "age": 25, "is_manager":True}
obj, created = Person.objects.update_or_create(identifier='id',
defaults=update_values)
if created:
obj.update(**new_values)
생성할 때 입력 중 하나가 기본 키인 경우 이 정도면 충분합니다.
Person.objects.get_or_create(id=1)
기본 키가 동일한 두 데이터는 허용되지 않으므로 존재하는 경우 자동으로 업데이트됩니다.
이것이 당신이 찾고 있는 답이어야 합니다.
EmployeeInfo.objects.update_or_create(
#id or any primary key:value to search for
identifier=your_id,
#if found update with the following or save/create if not found
defaults={'name':'your_name'}
)
언급URL : https://stackoverflow.com/questions/14115318/create-django-model-or-update-if-exists
'programing' 카테고리의 다른 글
Oracle에서 varchar를 별도의 열로 분할 (0) | 2023.06.15 |
---|---|
python-dev 설치 오류:가져오기 오류: 이름이 apt_pkg인 모듈이 없습니다. (0) | 2023.06.15 |
Python 요청이 자체 서명된 SSL 인증서를 신뢰하도록 하는 방법은 무엇입니까? (0) | 2023.06.10 |
VBA가 엑셀에서 MySQL 데이터베이스에 어떻게 연결할 수 있습니까? (0) | 2023.06.10 |
쉼표로 구분된 문자열을 입력할 수 있습니까? (0) | 2023.06.10 |