使用:python 3.4,flask-admin 1.0.8,sqlalchemy 0.9.7,最新稳定的mariadb / mysql后端
是的,我意识到它是“实验性的”,但我正在尝试使用sqlalchemy的automap功能来反映现有的架构。它似乎工作正常,除了管理表单上的相关记录值显示为< sqlalchemy.ext.automap ...>对象。我相信每个模型类中的__unicode__ def都可以解决问题但不确定如何在使用automap时指定它。
这是我试图通过Admin界面编辑的表格
CREATE TABLE `hardware_owner` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`hardware_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `hardware_owner_fk_1` (`hardware_id`),
KEY `hardware_owner_fk_2` (`user_id`),
CONSTRAINT `hardware_owner_fk_1` FOREIGN KEY (`hardware_id`) REFERENCES `hardware` (`id`) ON DELETE CASCADE,
CONSTRAINT `hardware_owner_fk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB
这是管理员视图
from someapp import app, db
from sqlalchemy.ext.automap import automap_base
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin import Admin
Base = automap_base(metadata=db.metadata)
Base.prepare()
admin = Admin(app, name='SomeApp Admin')
admin.add_view(ModelView(Base.classes.user, db.session))
admin.add_view(ModelView(Base.classes.hardware, db.session))
admin.add_view(ModelView(Base.classes.hardware_owner, db.session))
在hardware_owner的admin创建视图中,我在用户和硬件的下拉列表中看到了正确数量的选项,因此我知道它正在拉动正确的相关行。我只需要弄清楚如何指定比< sqlalchemy.ext.automap。(table_name)object ...>更友好的标签。对于每一行。
有什么建议吗?
根据@joes
的回答进行更新我没有定义任何模型,因为automap就是这样做的,所以这就是我想出的将__str__ def添加到由automap定义的每个类中:
def obj_name_user(obj):
return obj.username
def obj_name_hardware(obj):
return obj.name
def obj_name_hardware_owner(obj):
return '%s - %s' % (obj.user.username, obj.hardware.name)
Base = automap_base(metadata=db.metadata)
Base.prepare()
Base.classes.user.__str__ = obj_name_user
Base.classes.hardware.__str__ = obj_name_hardware
Base.classes.hardware_owner.__str__ = obj_name_hardware_owner
这可以解决我原来的问题,但还有更好的方法吗?
答案 0 :(得分:0)
如果您使用的是python 2,请将__unicode__
添加到模型中。
如果您使用的是python 3 - 请添加__str__
。