es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

División de un valor de retorno de un campo híbrido de SQLAlchemy.

Tengo un modelo SQLAlchemy funcionando en una base de datos Postgresql. En mi modelo tengo un campo de tipo cadena llamado “invoice_number”, que se ordena de la siguiente manera:

  • 2022-01-1
  • 2022-01-10
  • 2022-01-2

(Me gustaría que se ordenaran como “-1, -2, …, -10, …”)

Para poder ordenar esto, me gustaría tener un campo híbrido que devuelva (y ordene correctamente) la cadena como una tupla, separada por “-“.

En mi modelo hasta ahora tengo (el código utiliza Flask-SQLAlchemy, que envuelve las cosas de SQLAlchemy detrás del objeto “db”, de lo contrario es lo mismo):

class Orders(db.Model):
    invoice_number = db.Column(db.String(32), nullable=True)

<pre><code>@hybrid_property
def invoice_number_parts(self):
    return self.invoice_number.split("-")

@invoice_number_parts.expression
def invoice_number_parts(cls):
    from sqlalchemy import func
    return func.split(cls.invoice_number)

Esto me da un “ValueError: Invalid model property name .invoice_number_parts”.

El tutorial menciona Funciones pero no puedo encontrar la documentación sobre qué funciones predefinidas están disponibles para Postgresql (supongo que esto sería posible con la función “string_to_array” del enlace siguiente: https://www.postgresql.org/docs/9.1/functions-array.html#ARRAY-FUNCTIONS-TABLE).

¿Estoy completamente equivocado en mi enfoque? No necesito un setter para esto y entiendo el “hybrid_property” como que devuelve el valor, y el “@…expression” como la parte que genera el SQL.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando está relacionado con el nombre de la propiedad híbrida que está en conflicto con la expresión existente invoice_number_parts. Puedes intentar cambiar el nombre de la propiedad híbrida a algo diferente, como splitted_invoice_number, para evitar el conflicto:

    class Orders(db.Model):
        invoice_number = db.Column(db.String(32), nullable=True)
    
        @hybrid_property
        def splitted_invoice_number(self):
            return self.invoice_number.split("-")
    
        @splitted_invoice_number.expression
        def splitted_invoice_number(cls):
            from sqlalchemy import func
            return func.split(cls.invoice_number)
    

    Respecto a las funciones de PostgreSQL, puedes encontrar la documentación de todas las funciones integradas aquí: https://www.postgresql.org/docs/current/functions.html. La función string_to_array que mencionaste también debería funcionar si prefieres usarla en lugar de split.

Comments are closed.