Trong chế độ xem django, tôi cần nối thêm dữ liệu chuỗi vào cuối cột văn bản hiện có trong cơ sở dữ liệu của tôi. Vì vậy, ví dụ, nói rằng tôi có một bảng có tên "ATable", và nó có một trường có tên là "aField". Tôi muốn có thể nối thêm một chuỗi vào cuối "aField" theo cách không có điều kiện. Ban đầu, tôi đã có này:Django: Sử dụng biểu thức F cho trường văn bản trong cuộc gọi cập nhật
tableEntry = ATable.objects.get(id=100)
tableEntry.aField += aStringVar
tableEntry.save()
Vấn đề là nếu điều này được thực hiện đồng thời, cả hai có thể nhận được cùng một "tableEntry", sau đó họ từng một cách độc lập cập nhật, và người cuối cùng để "cứu" thắng, thua dữ liệu được người khác nối thêm.
Tôi nhìn vào trong này một chút và thấy điều này, mà tôi hy vọng sẽ làm việc, sử dụng một biểu thức F:
ATable.objects.filter(id=100).update(aField=F('aField') + aStringVar)
Vấn đề ở đây, là tôi nhận được một lỗi SQL, nói:
operator does not exist: text + unknown
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Đã cố gắng thay đổi thành "str (aStringVar)" mặc dù nó đã là một chuỗi - không may mắn .. Tôi tìm thấy một vài báo cáo lỗi django phàn nàn về các vấn đề tương tự, nhưng tôi không thấy một sửa chữa hoặc một workaround. Có cách nào tôi có thể cast aStringVar sao cho nó có thể được thêm vào văn bản của biểu thức F? BTW - cũng đã thử "str (F ('aField')) + aStringVar" nhưng đã chuyển đổi kết quả của biểu thức F thành chuỗi "(DEFAULT:)".
Bạn có thể thấy Django sqlquery thử thực thi không? – Willian
có thể trùng lặp của [Tôi có thể sử dụng các đối tượng Django F() với chuỗi nối không?] (Http://stackoverflow.com/questions/3300944/can-i-use-django-f-objects-with-string-concatenation) – Alasdair
Tôi nghĩ rằng giải thích của Daniel về câu hỏi khác là khá dứt khoát. Để thay thế, bạn có thể viết [custom sql] (https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly) để thực hiện các cập nhật của bạn. – Alasdair