【问题标题】:model_to_dict raise AttributeError when set lazy_load to False for ForeignKeyField in Peewee当 Peewee 中的 ForeignKeyField 的lazy_load 设置为 False 时,model_to_dict 会引发 AttributeError
【发布时间】:2021-06-30 09:26:23
【问题描述】:

我在我的烧瓶项目中使用 Peewee。

代码如下。

# model
class Release(Model):
    created_at = DateTimeField()
    project = ForeignKeyField(Project, backref='releases', lazy_load=False)

# ...

# controller
class ProjectReleaseController(Resource):

    def get(self, project_id, release_id):
        record = Release.get_or_none(Release.id == release_id)
        logger.info(f'{record}')
        return jsonify(model_to_dict(record))

# ...
api.add_resource(ProjectReleaseController, '/projects/<project_id>/releases/<release_id>')

发送GET:/projects/1/releases/2到服务器时,model_to_dict会报错

    field_data = model_to_dict(
    ...
    for field in model._meta.sorted_fields:
AttributeError: 'int' object has no attribute '_meta'

logger.info(f'{record}) 输出2。 (???为什么???)

如果我将lazy_load=True(默认值)更改如下

project = ForeignKeyField(Project, backref='releases', lazy_load=True)

然后它会返回正确的值。

{
  "created_at":"2021-06-29T18:56:28.718841",
  "id":2,
  "project":
    {
      ''' quite many things '''
    }
}

问题是:

  1. 如何理解它与lazy_loadFalseTrue 的行为如此不同。
  2. lazy_load=True时,如何摆脱项目信息的回复只需给我project_id: 1

感谢您的宝贵时间!

【问题讨论】:

    标签: python flask peewee


    【解决方案1】:

    这是我发现的。

    model_to_dict () 接受参数recurse 来指示是否应该递归外键。你可以在document找到它。

    user = User.create(username='charlie')
    model_to_dict(user, recurse=False)
    

    在这种情况下,上述项目信息不会被递归。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2011-04-18
      • 2014-05-13
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多