Flask-admin: Как сделать inline-редактирование для многих отношений?

У меня две модели

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

Когда я добавляю стикер к сообщению в панели администратора, которое выглядит так:образ

и попытаться сохранить страницу, я получаю следующую ошибку:образ

Пытался взломать мой путь scaffold_inline_form_models и в нескольких других направлениях, но пока не повезло. Любые предложения будут очень признательны. Спасибо!

2 ответа

Хорошо, вот как я это решил.

Я изменил таблицу отношений, чтобы иметь отдельный 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 - никаких глупостей.

Я думаю, что таблица, которую вы создали как промежуточную модель, неверна. Я делаю отношения "многие ко многим" следующим образом: я изменил код в вашей ситуации:

sticker_message_asociation = db.Table(
    'sticker_message_asociation',
    db.Column(db.Integer, db.ForeignKey('message.id')),
    db.Column(db.Integer, db.ForeignKey('sticker.id'))
    )
Другие вопросы по тегам