首页 > 解决方案 > flask-restful 循环嵌套资源的问题

问题描述

我在单独的文件中有两个字段要编组。他们是:

from games.controllers.api.categories import category_fields
game_fields = {
    'title': fields.String,
    'developer': fields.String,
    'categories': fields.List(fields.Nested(category_fields)),
    'uri': fields.Url('game')
}

from games.controllers.api.games import game_fields
category_fields = {
    'name': fields.String,
    'games': fields.List(fields.Nested(game_fields)),
    'uri': fields.Url('category')
}

当我运行该应用程序时,它会抛出一个错误:

ImportError: cannot import name 'category_fields' from 'games.controllers.api.categories'

显然问题在于循环导入。那么我应该如何解决这个问题呢?

顺便说一句:game_fields 中的“开发者”部分向我显示“ <Developer 1>”。当我将其更改为“developer_id”:fields.Integer 时,它可以毫无问题地为我提供开发人员 ID。但我希望它像“开发者”:“EA Sports”。我怎样才能做到这一点?

标签: pythonflaskflask-sqlalchemyflask-restful

解决方案


像这样的递归结构肯定会给您带来问题,但是如果您决定这样做,这是避免循环导入错误的一种可能方法:

game_fields = {
    'title': fields.String,
    'developer': fields.String,
    'uri': fields.Url('game')
}
from games.controllers.api.categories import category_fields
game_fields['categories'] = fields.List(fields.Nested(category_fields))
category_fields = {
    'name': fields.String,
    'uri': fields.Url('category')
}
from games.controllers.api.games import game_fields
category_fields['games'] = fields.List(fields.Nested(game_fields))

至于你的第二个问题,你还没有描述你的Developer班级是什么样的。如果您可以控制此类,则可以更改此类将自身呈现为字符串的方式,并使其成为开发人员的名称,而不是<Developer id>.


推荐阅读