get_or_create를 사용하는 올바른 방법은 무엇입니까?


203

내 양식의 일부 필드에 get_or_create를 사용하려고하는데 그렇게 할 때 500 오류가 발생합니다.

라인 중 하나는 다음과 같습니다.

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

위 코드에서 발생하는 오류는 다음과 같습니다.

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.

답변:


353

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. 나머지 필드는에 포함되어야 defaults합니다. CREATE 이벤트가 발생하면 모든 필드가 고려됩니다.

단일 변수 대신 튜플로 반환 해야하는 것처럼 보입니다.

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

3
참고로 만든 부울입니다. 생성 된 경우 True, 페치 된 경우 False
Josh

3
추가 save()는 중복입니까?
zypro

@zypro 마치 create()객체를 만들고 한 번에 저장하고 필요하지 않습니다.save()
Amin Mir

32

get_or_create 튜플을 반환합니다.

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

16
또는 부울 플래그에 관심이없는 경우 :customer.source = Source.objects.get_or_create(name="Website")[0]
mipadi

7
@mipadi customer.source, _ = Source.objects.get_or_create(name="Website")튜플이 더 명확하게 반환되어 향후 버그를 피할 수 있기 때문에 선호합니다 .
Solomon Ucko

15

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

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

  • customer.source get_or_create() 방법 의 대상이 있습니다.


12

생성 된 플래그에 관심이 없다면 @Tobu 답변과 @mipadi 의견에 더 비유적인 방법으로 다음을 사용합니다.

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

4

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

"defaults"이외의 키워드 인수를 사용할 때의 반환 값은 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.