Właściwy sposób korzystania z get_or_create?


Próbuję użyć get_or_create dla niektórych pól w moich formularzach, ale kiedy próbuję to zrobić, pojawia się błąd 500.
Jedna z linii wygląda tak:
customer.source = Source.objects.get_or_create(name="Website")

Błąd jaki otrzymuję dla powyższego kodu to:
Cannot assign "(<Source: Website>, False)": "Customer.source" 
must be a "Source" instance.

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Z dokumentacji

get_or_create
https://docs.djangoproject.com ... reate
:
# 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


Wyjaśnienie:

pola, które mają być ocenione pod względem podobieństwa, muszą być wymienione poza
defaults
. Pozostałe pola muszą być uwzględnione w
defaults
. W przypadku wystąpienia zdarzenia CREATE wszystkie pola zostaną wzięte pod uwagę.
Wygląda na to, że musisz zwrócić krotkę, a nie jedną zmienną, wykonaj następujące czynności:
customer.source,created = Source.objects.get_or_create(name="Website")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

get_or_create
zwraca krotkę.
customer.source, created = Source.objects.get_or_create(name="Website")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

get_or_create()
https://docs.djangoproject.com ... reate
zwraca krotkę:
customer.source, created = Source.objects.get_or_create(name="Website")

  • created
    ma logiczne znaczenie, niezależnie od tego, czy jest utworzony, czy nie.
  • customer.source
    ma obiekt metody
    get_or_create ()
    .
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Podążając za odpowiedzią @ Tobu i komentarzem @ mipadi, w bardziej pythonowy sposób, gdybym nie był zainteresowany wygenerowaną flagą, użyłbym:
customer.source, _ = Source.objects.get_or_create(name="Website")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Problem, z którym się zmagasz, to udokumentowana funkcja
get_or_create
.
W przypadku używania argumentów słów kluczowych innych niż „defaults” zwracana wartość
get_or_create
jest instancją. Dlatego pokazuje pareny w zwracanej wartości.
możesz użyć
customer.source = Source.objects.get_or_create (name = "Website") [0]
, aby uzyskać poprawną wartość.
Oto link do dokumentacji:

http://docs.djangoproject.com/ ... wargs
http://docs.djangoproject.com/ ... wargs

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się