为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2022-01-11 20:30:02
我在 SQLAlchemy 中有一堆要定义的表__repr__。标准约定看起来像这样:def __repr__(self):     return "<TableName(id='%s')>" % self.id这对小桌子来说很好。但是,我有 40 多列的表。 有没有更好的构造方法,__repr__这样我就不会手动输入大量字符串?我的包含所有表格的文件称为models.py. 一种解决方案我想到了制作方法,_create_repr_string在models.py该负责自动生成的字符串进行__repr__返回。我想知道是否有更标准的方式来创建__repr__.
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

在__repr__导航日志文件和堆栈跟踪时,对复杂对象具有良好功能可能非常有用,因此您尝试为它提出一个好的模式真是太好了。


我喜欢有一个默认的小助手(在我的例子中,BaseModel 被设置为model_class初始化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='foo@bar.com')>,blah='hi')>


查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 377 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信