2009-12-21 70 views
125

Tôi đang cố gắng sử dụng get_or_create cho một số trường trong biểu mẫu của mình, nhưng tôi gặp phải lỗi 500 khi tôi cố gắng làm như vậy.Cách chính xác để sử dụng get_or_create?

Một trong những dòng như sau:

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

Các lỗi tôi nhận được cho các mã trên là:

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

Tại sao chỉnh sửa, Dominic? Thông báo lỗi rất hữu ích. – Tobu

Trả lời

211

Từ các tài liệu 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 

Có vẻ như bạn cần phải được trở thành một tuple, thay vì một biến duy nhất, làm như thế này:

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

get_or_create trả về một tuple.

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

Hoặc, nếu bạn không quan tâm đến cờ boolean: 'customer.source = Source.objects.get_or_create (name =" Website ") [0]' – mipadi

3

Vấn đề này bạn đang gặp phải là một tính năng được ghi lại của get_or_create.

Khi sử dụng đối số từ khóa khác với "mặc định", giá trị trả lại là get_or_create là một phiên bản. Đó là lý do tại sao nó cho bạn thấy các parens trong giá trị trả về.

bạn có thể sử dụng customer.source = Source.objects.get_or_create(name="Website")[0] để nhận giá trị chính xác.

Dưới đây là một liên kết cho các tài liệu: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

2

Sau @Tobu câu trả lời và bình luận @mipadi, theo một cách pythonic hơn, nếu không quan tâm đến cờ tạo ra, tôi sẽ sử dụng:

customer.source, _ = Source.objects.get_or_create(name="Website") 
Các vấn đề liên quan