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