【问题标题】:Foreign key relationship in Flask-Admin when using SQLAlchemy automap使用 SQLAlchemy 自动映射时 Flask-Admin 中的外键关系
【发布时间】:2014-09-13 23:27:52
【问题描述】:

使用:python 3.4、flask-admin 1.0.8、sqlalchemy 0.9.7、最新稳定的 mariadb/mysql 后端

是的,我意识到这是“实验性的”,但我正在尝试使用 sqlalchemy 的自动映射功能来反映现有架构。它似乎工作正常,除了管理表单上显示为 对象的相关记录值。我相信每个模型类中 __unicode__ 的 def 可以解决问题,但不确定在使用 automap 时如何指定它。

这是我尝试通过管理界面编辑的表格

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 的管理员创建视图中,我在用户和硬件的下拉列表中看到了正确数量的选项,因此我知道它正在提取正确的相关行。我只需要弄清楚如何为每一行指定一个比 更友好的标签。

有什么建议吗?

根据@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

这有效并解决了我原来的问题,但有更好的方法吗?

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy flask-admin


    【解决方案1】:

    如果您使用的是 python 2,请将 __unicode__ 添加到您的模型中。

    如果您使用的是 python 3 - 添加 __str__

    【讨论】:

    • 啊,是的,_str_ 在 python 3 中,不是 unicode,谢谢!!但是自从 automap 创建它们以来,我还没有定义任何模型类。请参考我上面的更新,看看我是如何添加 _str_ def
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多