sourcetip

장고에서 "get_or_create()"를 사용하는 방법은 무엇입니까?

fileupload 2023. 6. 17. 09:37
반응형

장고에서 "get_or_create()"를 사용하는 방법은 무엇입니까?

사용하려고 합니다.get_or_create()양식의 일부 필드에 대해 입력합니다. 그러나 입력하려고 하면 500개의 오류가 발생합니다.

선 중 하나는 다음과 같습니다.

customer.source = Source.objects.get_or_create(name="Website")

위 코드에 대한 오류는 다음과 같습니다.

"(<소스:웹사이트>, 거짓): "고객.source"는 "Source" 인스턴스여야 합니다.

설명서에서 get_or_create:

# get_or_create() a person with similar first names.

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

# get_or_create() didn't have to create an object.
>>> created
False

설명:유사성을 평가할 필드는 외부에서 언급해야 합니다.defaults나머지 필드는 다음에 포함되어야 합니다.defaultsCREATE 이벤트가 발생할 경우 모든 필드가 고려됩니다.

단일 변수 대신 튜플로 돌아가야 하는 것처럼 보입니다. 다음과 같이 하십시오.

customer.source,created = Source.objects.get_or_create(name="Website")

get_or_create튜플을 반환합니다.

customer.source, created = Source.objects.get_or_create(name="Website")

get_or_create() 튜플을 반환합니다.

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created 부울 값이 있고 생성되었는지 여부를 나타냅니다.

  • customer.source 의 목적을 가지다get_or_create()방법.

@Tobu 답변과 @mipadi 코멘트에 이어, 생성된 플래그에 관심이 없다면, 저는 다음을 사용할 것입니다.

customer.source, _ = Source.objects.get_or_create(name="Website")

현재 발생하는 문제는 의 문서화된 기능입니다.get_or_create.

"기본값"이 아닌 키워드 인수를 사용할 경우 반환 값은 다음과 같습니다.get_or_create는 인스턴스입니다.그것이 당신에게 반환값의 부모님을 보여주는 이유입니다.

당신은 사용할 수 있습니다.customer.source = Source.objects.get_or_create(name="Website")[0]정확한 값을 얻기 위해.

설명서 링크는 다음과 같습니다. http://docs.djangoproject.com/en/dev/ref/models/querysets/ #get-or-create-kwargs

get_or_create 메서드는 실제로 튜플을 반환합니다.

get_or_create 메서드의 트릭은 실제로 (개체, 생성됨)의 튜플을 반환한다는 것입니다.첫 번째 요소는 검색하려는 모델의 인스턴스이고 두 번째 요소는 인스턴스가 생성되었는지 여부를 알려주는 부울 플래그입니다.True는 get_or_create 메서드에 의해 인스턴스가 생성되었음을 의미하고 False는 데이터베이스에서 검색되었음을 의미합니다.

따라서 소스 인스턴스를 가져오는 것과 같은 작업을 수행할 수 있습니다.

 ```   customer.source = Source.objects.get_or_create(name="Website")[0]
 ```

get_or_create()는 두 개의 값을 포함하는 튜플을 반환합니다. 첫 번째 값은 개체이고 두 번째 값은 다음과 같이 새 개체가 생성되었는지 여부를 나타내는 부울 값입니다.

 # 1st   # 2nd
(object, boolean)

따라서 객체와 부울 값을 모두 원하는 경우 변수를 하나 더 추가합니다.created끝나고customer.source아래와 같이:

                 # Here
customer.source, created = Source.objects.get_or_create(name="Website")
# object         # boolean

그리고, 부울 값이 없는 객체만 원한다면,[0] 바로 get_or_create()아래와 같이:

                                                       # Here ↓↓↓
customer.source = Source.objects.get_or_create(name="Website")[0]
# object

그리고 객체 없이 부울 값만 원하는 경우에는[1] 바로 get_or_create()아래와 같이:

                                               # Here ↓↓↓
created = Source.objects.get_or_create(name="Website")[1]
# boolean

중요한 경고입니다.

get_or_create, https://docs.djangoproject.com/en/4.0/ref/models/querysets/ 을 사용하기 전에 다음 사항을 주의해야 합니다.경고

이 방법은 데이터베이스가 키워드 인수의 고유성을 적용한다고 가정할 때 원자적입니다(unique 또는 unique_together 참조).키워드 인수에 사용된 필드에 고유 제약 조건이 없는 경우 이 메서드에 대한 동시 호출로 인해 동일한 매개 변수를 가진 여러 행이 삽입될 수 있습니다.

언급URL : https://stackoverflow.com/questions/1941212/how-to-use-get-or-create-in-django

반응형