亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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='[email protected]')>,blah='hi')>


查看完整回答
反對 回復 2022-01-11
  • 1 回答
  • 0 關注
  • 456 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號