2009-12-21 16 views
125

Próbuję użyć get_or_create dla niektórych pól w moich formularzach, ale otrzymuję błąd 500, gdy próbuję to zrobić.Prawidłowy sposób korzystania z get_or_create?

Jedna z linii wygląda następująco:

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

Błąd pojawia dla powyższego kodu jest:

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

Dlaczego edycja, Dominic? Komunikat o błędzie był przydatny. – Tobu

Odpowiedz

211

Z dokumentacji 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 

wygląda jak trzeba wracać do krotki, zamiast pojedynczej zmiennej, zrób tak:

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

get_or_create zwraca krotki.

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

Lub, jeśli nie interesuje cię flaga binarna: 'customer.source = Source.objects.get_or_create (name =" Website ") [0]' – mipadi

3

Kwestia napotkasz jest udokumentowaną funkcją get_or_create.

Podczas używania argumentów słów kluczowych innych niż "wartości domyślne" zwracana jest wartość get_or_create. Dlatego pokazuje ci parens w wartości zwracanej.

możesz użyć customer.source = Source.objects.get_or_create(name="Website")[0], aby uzyskać poprawną wartość.

Tu jest link do dokumentacji: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

2

Po @Tobu odpowiedź i @mipadi komentarzu, w bardziej pythonic sposób, jeśli nie interesuje utworzonej flagą, użyłbym:

customer.source, _ = Source.objects.get_or_create(name="Website") 
Powiązane problemy