Hola usuario de nuestra web, hallamos la respuesta a lo que buscabas, continúa leyendo y la encontrarás a continuación.
Solución:
Tuve un problema similar; Básicamente, quería concatenar dos campos para obtener el nombre completo de un usuario. Lo resolví de esta manera (pero debo decir que estaba usando Postgres):
from django.db.models.functions import Concat
from django.db.models import F, Value, CharField
AnyModel.objects.filter(**kwargs).annotate(full_name=Concat(F('model__user_first_name'), Value(' '), F('model__user_last_name'), output_field=CharField()))
donde, F('...')
evalúa su argumento como una consulta, por lo que puede consultar un campo del modelo en sí, o abarcar modelos como lo haría en filter / get, mientras Value('...')
evalúa su argumento literalmente (en mi caso, necesitaba un espacio entre first_name
y last_name
), y output_field=...
especifica el tipo del campo anotado (quería ser un CharField
). Para obtener más información, puede leer los documentos de Django sobre Concat
Espero que sea de ayuda para alguien. Salud
Lo que está sucediendo es que Django está pasando el ‘+’ a través de SQL, pero SQL no permite el uso de ‘+’ para la concatenación, por lo que intenta sumar numéricamente. Si usa un número entero en lugar de ‘a string’, funciona en el sentido de que agrega el valor entero de my_other_field
a su variable.
Es discutible si esto es un error. La documentación para F()
objetos en los estados de consultas de búsqueda:
Django admite el uso de suma, resta, multiplicación, división y aritmética de módulo con
F()
objetos
por lo que se podría argumentar que no debería intentar usarlo para actualizar con cadenas. Pero eso ciertamente no está documentado, y el mensaje de error ‘Valor DOBLE incorrecto’ no es muy útil. Abriré un boleto.
Puedes usar Concat función https://docs.djangoproject.com/en/1.9/ref/models/database-functions/#concat
from django.db.models.functions import Concat
from django.db.models import Value
MyModel.objects.filter(**kwargs).update(my_field=Concat('my_other_field', Value('a string'))
Reseñas y valoraciones
Eres capaz de añadir valor a nuestro contenido informacional tributando tu veteranía en las explicaciones.