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ć.
Jedna z linii wygląda następująco:
customer.source = Source.objects.get_or_create(name="Website")
Występuje błąd dla powyższego kodu:
Cannot assign "(<Source: Website>, False)": "Customer.source"
must be a "Source" instance.
save()
jest zbędna?create()
, stwórz obiekt i zapisz go w jednym kroku i nie potrzebuje żadnegosave()
get_or_create
zwraca krotkę.źródło
customer.source = Source.objects.get_or_create(name="Website")[0]
customer.source, _ = Source.objects.get_or_create(name="Website")
, ponieważ dzięki temu krotka została zwrócona bardziej oczywista, co pomaga uniknąć przyszłych błędów.get_or_create()
zwraca krotkę:created
→ ma wartość logiczną, został utworzony lub nie.customer.source
→ ma obiektget_or_create()
metody.źródło
Po odpowiedzi na @Tobu i komentarzu @mipadi, w bardziej pythonowy sposób, jeśli nie jestem zainteresowany stworzoną flagą, użyłbym:
źródło
Napotkany problem to udokumentowana funkcja
get_or_create
.Gdy używasz argumentów słów kluczowych innych niż „defaults”, zwracaną wartością
get_or_create
jest instancja. 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ść.Oto link do dokumentacji: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs
źródło