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

У меня есть две модели

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 голосов
/ 18 октября 2018

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

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

0 голосов
/ 18 октября 2018

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

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