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.

Peewee Model, dicts() – Modelo de Peewee, dicts()

Estoy depurando código existente. Estoy tratando de averiguar la intención del acceso obviamente incorrecto a .dicts de un modelo peewee en la declaración de advertencia en MyDbBackend.store y cómo podría corregir eso.
Supongo que el mensaje de advertencia debería agregar una salida más detallada al modelo que no se pudo guardar. Sin embargo, el atributo .dicts existe solo en la clase orm.BaseQuery.

El mensaje de salida no es muy útil actualmente. Quiero proporcionar un mensaje de advertencia mejorado dado que i.save no funciona. Con “mejorado” quiero decir que proporcionará alguna información adicional sobre el registro que no se pudo guardar.

Entonces, ¿cómo puedo obtener BaseQuery desde el modelo y qué produciría .dicts entonces? ¿Sería útil esa información en el contexto del mensaje de advertencia?

import peewee as orm

base_datos = orm.Proxy()

class ModeloBase(orm.Model):
    class Meta:
        database = base_datos

class MiModelo(ModeloBase):
    campo_fecha_hora  = orm.DateTimeField(null=True)
    campo_entero      = orm.IntegerField(null=True)
    campo_float       = orm.FloatField(null=True)

class MyDbBackend:
    def __init__(self, base_datos):
        self.bd = base_datos
        self.registros = []  # Holds objects derived from ModelBase.

[...]

def almacenar(self):
    with self.bd.atomic():
        for i in self.registros:
            try:
                i.save()
            except Exception as e:
                logger.warning("no se pudo guardar el registro: {}".format(i.dicts()))
                raise e

    self.limpiar()
->

logger.warning(“no se pudo guardar el registro: {}”.format(i.dicts()))
AttributeError: el objeto ‘MiModelo’ no tiene un atributo ‘dicts’

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El código está tratando de acceder al atributo .dicts de un objeto Model (i) para mostrar información sobre el registro que no se guardó. Sin embargo, el atributo .dicts pertenece a la clase BaseQuery, no a la clase Model. Por lo tanto, acceder a i.dicts() provoca que se genere un AttributeError.

    Para obtener el objeto BaseQuery del objeto Model, se puede llamar al método select() en la clase Model. Este método devuelve un objeto BaseQuery que se puede usar para ejecutar consultas contra la base de datos.

    En el contexto del mensaje de advertencia, el atributo .dicts puede no ser muy útil, ya que solo proporciona un iterador sobre los diccionarios que representan las instancias del modelo en la consulta. En su lugar, se podrían mostrar algunos de los campos del registro que no se guardó, como los valores de los atributos dtfield, intfield y floatfield. Por ejemplo:

    logger.warning("no se pudo guardar el registro: dtfield={}, intfield={}, floatfield={}".format(
        i.dtfield, i.intfield, i.floatfield))
    

    Esto proporcionaría información más específica sobre el registro que no se guardó, lo que facilitaría la identificación de la causa del error.

Comments are closed.