【问题标题】:Displaying joined fields in Flask-Admin ModelView在 Flask-Admin ModelView 中显示连接字段
【发布时间】:2022-01-01 04:08:57
【问题描述】:

我有一个使用 Flask-SQLAlchemy 的 Flask 应用程序和一些简单的关系数据映射,例如Orders 和属于这些订单的 OrderItems 之间。

在我的 Flask-Admin 后端,我想在 OrderItems 列表中显示 一些 的订单属性——而不是拥有整个订单对象。例如。在 OrderItems' 行中列出“Order.email”(可以是只读的)。

我已经查看了 ModelView 的 inline_models 属性,但这似乎更害怕实际编辑关系对象 - 我只想显示(并排序/搜索)“父”的某些值.

有没有办法做到这一点?

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案1】:

    您可以通过外键关系轻松地包含字段,方法是将它们包含在 column_list 值 - documentation 中。考虑两个简化模型,注意Address 模型中的company 反向引用:

    class Company(db.Model):
        __tablename__ = 'companies'
    
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.Unicode(255), nullable=False, unique=True, index=True)
        website = db.Column(db.Unicode(255), nullable=True)
        notes = db.Column(db.UnicodeText())
    
        @hybrid_property
        def address_count(self):
            return len(self.addresses)
    
        @address_count.expression
        def address_count(cls):
            return select([func.count(Address.id)]).where(Address.company_id == cls.id).label("address_count")
    
    
        def __str__(self):
            return self.name
    
    
    class Address(db.Model):
        __tablename__ = 'addresses'
    
        id = db.Column(db.Integer, primary_key=True)
        address1 = db.Column(db.Unicode(255), nullable=False)
        town = db.Column(db.Unicode(255), index=True, nullable=False)
        county = db.Column(db.Unicode(255))
        country = db.Column(db.Unicode(255))
        post_code = db.Column(db.Unicode(10))
    
        company_id = db.Column(db.Integer, db.ForeignKey('companies.id'), index=True)
        company = db.relationship(Company, backref=db.backref('addresses', uselist=True, lazy='select', cascade='delete-orphan,all'))
    
    
        def __str__(self):
            return ', '.join(filter(None, [self.address1, self.town, self.county, self.post_code, self.country]))
    

    在地址视图中,您可以使用虚线表示法访问“母公司”。例如:

    class AddressView(ModelAdmin):
    
        column_list = (
            'company.name',
            'company.website',
            'address1',
            'address2'
            )
    

    【讨论】:

    • Flask 领域中事物的优雅有时仍然令人费解......我什至没有想到它可能这么容易:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多