【问题标题】:Flask-admin, editing relationship giving me object representation of Foreign Key objectFlask-admin,编辑关系给我外键对象的对象表示
【发布时间】:2016-02-15 08:25:38
【问题描述】:

我有一个烧瓶项目,我开始学习烧瓶管理模块。

所需表的 SqlAlchemy 架构。

import datetime
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import backref, relationship

Base = declarative_base()


class Workgroup(Base):
    __tablename__ = 'workgroups'
    id = sqlalchemy.Column(sqlalchemy.Integer,

                           primary_key=True,
                           autoincrement=True
                           )
    name = sqlalchemy.Column(sqlalchemy.String(16))
    shorthand = sqlalchemy.Column(sqlalchemy.String(4))

    def __unicode__(self):
        return self.name

class Drive(Base):
    """
    A drive in an edit station.
    """
    __tablename__ = 'drives'

    id = sqlalchemy.Column(sqlalchemy.Integer,
                           primary_key=True,
                           autoincrement=True
                           )
    name = sqlalchemy.Column(sqlalchemy.String(64))
    computer_id = sqlalchemy.Column(sqlalchemy.Integer,
                                    sqlalchemy.ForeignKey(Computer.id)
                                    )
    computer = relationship('Computer', backref='drives')
    is_active = sqlalchemy.Column(sqlalchemy.Boolean)
    free_space = sqlalchemy.Column(sqlalchemy.BigInteger)
    used_space = sqlalchemy.Column(sqlalchemy.BigInteger)
    total_space = sqlalchemy.Column(sqlalchemy.BigInteger)
    percentage_full = sqlalchemy.Column(sqlalchemy.Float)
    boot_time = sqlalchemy.Column(sqlalchemy.DateTime)

    last_changed_workgroup = sqlalchemy.Column(sqlalchemy.DateTime)
    last_checked_in = sqlalchemy.Column(sqlalchemy.DateTime)
    last_notified = sqlalchemy.Column(sqlalchemy.DateTime)
    image_version = sqlalchemy.Column(sqlalchemy.String(64))
    image_date = sqlalchemy.Column(sqlalchemy.DateTime)
    current_workgroup_id = sqlalchemy.Column(sqlalchemy.Integer,
                                             sqlalchemy.ForeignKey(Workgroup.id)
                                             )
    workgroup = relationship('Workgroup', backref='drives')

管理员测试

class DriveAdmin(sqla.ModelView):
    column_display_pk = True
    column_hide_backrefs = False
    column_display_all_relations = True
    form_columns = [ 'computer_id', 'workgroup.name', ]
    column_list = ('computer.name', 'name', 'workgroup', 'computer.short_description', 'computer.notes',
                   'computer.station_type.description', 'computer.room.name')


class WorkgroupAdmin(sqla.ModelView):
    column_display_pk = True # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    column_list = ('id', 'name', 'shorthand')


# Create admin
admin = admin.Admin(app, name='Example: SQLAlchemy2', template_mode='bootstrap3')
admin.add_view(WorkgroupAdmin(schema.Workgroup, db))
admin.add_view(DriveAdmin(schema.Drive, db))

将“workgroup”的表单列替换为“workgroup.name”会给我一个无效的模型属性名称,即使我已在代码中的其他地方成功使用了 schema.workgroup.name。

生成的管理表单如下所示。

如何让 workgroup.name 值出现而不是对象表示?

感谢阅读!

【问题讨论】:

  • 你用的是python 3还是python 2?
  • 我使用的是 python 3.4。
  • 尝试在模型中添加一个``` __str__``` 或__repr__ 方法

标签: python flask sqlalchemy flask-admin


【解决方案1】:

您需要让工作组类通过 repr 函数返回其名称。这样它就会显示在字段中。

class Workgroup(Base):
    __tablename__ = 'workgroups'
    id = sqlalchemy.Column(sqlalchemy.Integer,

                           primary_key=True,
                           autoincrement=True
                           )
    name = sqlalchemy.Column(sqlalchemy.String(16))
    shorthand = sqlalchemy.Column(sqlalchemy.String(4))

    def __unicode__(self):
        return self.name

    def __repr__(self):
        return '<Workgroup %r>' % (self.name)

【讨论】:

  • 这行得通,但我可能会误解__unicode__ 的用法,因为那是我使用__unicode__ 的最终目的
猜你喜欢
  • 2020-02-12
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2021-02-07
  • 2011-08-31
  • 2013-01-29
  • 2017-05-01
相关资源
最近更新 更多