【问题标题】:Flask-admin: How to do inline editing for manytomany relations?Flask-admin:如何对多对多关系进行内联编辑?
【发布时间】:2018-10-17 13:12:37
【问题描述】:

我有两个模型

class Message(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    message_text = db.Column(db.Text, nullable=True)
    stickers = db.relationship('StickerMessageAssociation', back_populates='message')
    ...

class Sticker(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    file_id = db.Column(db.String(255), nullable=False)
    messages = db.relationship('StickerMessageAssociation', back_populates='sticker')
   ...

以及连接这两者的中间模型:

class StickerMessageAssociation(db.Model):
    __tablename__ = 'message_to_sticker'

    message_id = db.Column(db.Integer, db.ForeignKey('message.id'), primary_key=True)
    sticker_id = db.Column(db.Integer, db.ForeignKey('sticker.id'), primary_key=True)

    message = db.relationship('Message', back_populates='stickers')
    sticker = db.relationship('Sticker', back_populates='messages')

当我尝试通过内联模型编辑启用对flask-admin中消息分配贴纸的支持时出现问题:

class InlineStickerModelForm(InlineFormAdmin):
    form_label = 'Stickers'

    def __init__(self):
        return super(InlineStickerModelForm, self).__init__(StickerMessageAssociation)


class MessageView(ModelView):
    ...
    inline_models = (..., InlineStickerModelForm())

当我在管理面板中为消息添加标签时,如下所示:

并尝试保存页面,我收到以下错误:

试图绕过scaffold_inline_form_models 和其他几个方向,但到目前为止没有运气。任何建议将不胜感激。谢谢!

【问题讨论】:

    标签: flask flask-sqlalchemy flask-wtforms flask-admin


    【解决方案1】:

    好的,这就是我的解决方法。

    我已将关系表更改为有一个单独的 PK,如下所示:

    class StickerMessageAssociation(db.Model, HandyModel):
        __tablename__ = 'message_to_sticker'
    
        id = db.Column(db.Integer, primary_key=True)
    
        message_id = db.Column(db.Integer, db.ForeignKey('message.id'), nullable=False)
        sticker_id = db.Column(db.Integer, db.ForeignKey('sticker.id'), nullable=False)
    
        message = db.relationship('Message', back_populates='stickers')
        sticker = db.relationship('Sticker', back_populates='messages')
    

    并将form_columns = ('id', 'sticker') 定义添加到InlineStickerModelForm

    【讨论】:

      【解决方案2】:

      我认为您作为中间模型创建的表不正确。我做多对多关系如下,我把代码改成你的情况:

      sticker_message_asociation = db.Table(
          'sticker_message_asociation',
          db.Column(db.Integer, db.ForeignKey('message.id')),
          db.Column(db.Integer, db.ForeignKey('sticker.id'))
          )
      

      【讨论】:

      • 谢谢,但很遗憾,这不是问题。我会尽快发布我的发现。我创建中间 M2M 表作为模型是因为(它在 SQLAlchemy 文档中的某个地方不太深)因为我经常需要向它添加更多字段。
      猜你喜欢
      • 2010-12-15
      • 2011-10-29
      • 2013-06-17
      • 2014-03-24
      • 1970-01-01
      • 2020-02-12
      • 2014-09-08
      • 2018-03-28
      • 1970-01-01
      相关资源
      最近更新 更多