Flask-admin:如何对许多关系进行内联编辑?

时间:2018-10-17 13:12:38

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

我有两个模型

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')

当我尝试通过内联模型编辑启用对烧瓶管理中的消息分配贴纸的支持时,会出现问题:

class InlineStickerModelForm(InlineFormAdmin):
    form_label = 'Stickers'

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


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

当我在管理面板中的邮件中添加标签时,该标签如下所示: image

并尝试保存页面,出现以下错误: image

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

我已将关系表更改为具有这样的单独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

就是这样。

改为使用Django-没有像这样的愚蠢问题。