Saltar al contenido

¿Puedo usar objetos Django F () con string ¿concatenación?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *