SQLAlchemy为大型表定义__repr__的最佳方法

问题描述 投票:1回答:1

我在SQLAlchemy中有一堆表,我想定义__repr__

标准惯例似乎如下:

def __repr__(self):
    return "<TableName(id='%s')>" % self.id

这对小桌子来说都很好。但是,我有40多列的表。是否有更好的方法来构建__repr__,这样我就不会手动输入一个巨大的字符串?

我的所有表格的文件名为models.py。我想到的一个解决方案是在_create_repr_string中制作一个方法models.py,它负责自动生成__repr__返回的字符串。我想知道是否有更标准的方法来创建__repr__

python sqlalchemy repr
1个回答
1
投票

在导航日志文件和堆栈跟踪时,为复杂对象提供良好的__repr__非常有用,所以你试图想出一个好的模式是很棒的。

我喜欢有一个默认的小帮手(在我的情况下初始化model_class时,BaseModel被设置为flask-sqlalchemy)。

import typing
import sqlalchemy as sa

class BaseModel(Model):

    def __repr__(self) -> str:
        return self._repr(id=self.id)

    def _repr(self, **fields: typing.Dict[str, typing.Any]) -> str:
        '''
        Helper for __repr__
        '''
        field_strings = []
        at_least_one_attached_attribute = False
        for key, field in fields.items():
            try:
                field_strings.append(f'{key}={field!r}')
            except sa.orm.exc.DetachedInstanceError:
                field_strings.append(f'{key}=DetachedInstanceError')
            else:
                at_least_one_attached_attribute = True
        if at_least_one_attached_attribute:
            return f"<{self.__class__.__name__}({','.join(field_strings)})>"
        return f"<{self.__class__.__name__} {id(self)}>"

现在你可以保持你的__repr__方法漂亮和整洁:

class MyModel(db.Model):

    def __repr__(self):
        # easy to override, and it'll honor __repr__ in foreign relationships
        return self._repr(id=self.id,
                          user=self.user,
                          blah=self.blah)

应该产生这样的东西:

<MyModel(id=1829,user=<User(id=21, email='[email protected]')>,blah='hi')>

© www.soinside.com 2019 - 2024. All rights reserved.