En una vista django, necesito adjuntar datos de cadena al final de una columna de texto existente en mi base de datos. Entonces, por ejemplo, digamos que tengo una tabla llamada "ATable", y tiene un campo llamado "aField". Me gustaría poder agregar una cadena al final de "aField" en una forma libre de condiciones de carrera. Inicialmente, tenía esto:Django: Usar una expresión F para un campo de texto en una llamada de actualización
tableEntry = ATable.objects.get(id=100)
tableEntry.aField += aStringVar
tableEntry.save()
El problema es que si esto se está ejecutando al mismo tiempo, ambos pueden obtener el mismo "tableEntry", a continuación, actualizar cada uno de ellos de forma independiente, y el último a "salvar" a gana, perdiendo los datos agregados por el otro.
miré en esto un poco y encontramos este, lo que yo esperaba que trabajar, utilizando una expresión F:
ATable.objects.filter(id=100).update(aField=F('aField') + aStringVar)
El problema aquí, es que me da un error SQL, diciendo:
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.
Intenté cambiar a "str (aStringVar)" aunque ya era una cadena, no tuve suerte ... Encontré un par de informes de errores de django quejándose de problemas similares, pero no vi una solución o una solución alternativa. ¿Hay alguna forma de que pueda lanzar un StringVar de forma que pueda adjuntarse al texto de la expresión F? Por cierto, también probé "str (F ('aField')) + aStringVar", pero eso convirtió el resultado de la expresión F en la cadena "(DEFAULT:)".
¿Puedes ver el sqlquery que Django intenta ejecutar? – Willian
posible duplicado de [¿Puedo usar objetos Django F() con concatenación de cadenas?] (Http://stackoverflow.com/questions/3300944/can-i-use-django-f-objects-with-string-concatenation) – Alasdair
Creo que la explicación de Daniel sobre la otra pregunta es bastante definitiva. Como alternativa, puede escribir [sql personalizado] (https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly) para realizar sus actualizaciones. – Alasdair