Связь внешнего ключа в Flask-Admin при использовании автокарты SQLAlchemy

используя: python 3.4, flask-admin 1.0.8, sqlalchemy 0.9.7, последний стабильный бэкенд mariadb/mysql

Да, я понимаю, что это «экспериментально», но я пытаюсь использовать функцию автоматического сопоставления sqlalchemy, чтобы отразить существующую схему. Похоже, он работает правильно, за исключением соответствующих значений записей в форме администратора, которые отображаются как объекты ‹sqlalchemy.ext.automap...›. Я полагаю, что определение для __unicode__ в каждом классе модели решит проблему, но не уверен, как указать его при использовании automap.

вот таблица, которую я пытаюсь редактировать через интерфейс администратора

CREATE TABLE `hardware_owner` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `hardware_id` int(11) unsigned NOT NULL,
  `user_id` int(11) unsigned DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `hardware_owner_fk_1` (`hardware_id`),
  KEY `hardware_owner_fk_2` (`user_id`),
  CONSTRAINT `hardware_owner_fk_1` FOREIGN KEY (`hardware_id`) REFERENCES `hardware` (`id`) ON DELETE CASCADE,
  CONSTRAINT `hardware_owner_fk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB

а вот вид администратора

from someapp import app, db

from sqlalchemy.ext.automap import automap_base
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin import Admin

Base = automap_base(metadata=db.metadata)
Base.prepare()

admin = Admin(app, name='SomeApp Admin')
admin.add_view(ModelView(Base.classes.user, db.session))
admin.add_view(ModelView(Base.classes.hardware, db.session))
admin.add_view(ModelView(Base.classes.hardware_owner, db.session))

В представлении admin create для hardware_owner я вижу правильное количество параметров в раскрывающемся списке для пользователя и оборудования, поэтому я знаю, что он вытягивает правильные связанные строки. Мне просто нужно выяснить, как указать более удобную метку, чем объект ‹sqlalchemy.ext.automap.(table_name) ...› для каждой строки.

Какие-либо предложения?

Обновление на основе ответа @joes

Я не определяю никаких моделей, поскольку это делает automap, поэтому вот что я придумал, чтобы добавить __str__ к каждому из классов, определенных automap:

def obj_name_user(obj):
    return obj.username

def obj_name_hardware(obj):
    return obj.name

def obj_name_hardware_owner(obj):
    return '%s - %s' % (obj.user.username, obj.hardware.name)

Base = automap_base(metadata=db.metadata)
Base.prepare()

Base.classes.user.__str__ = obj_name_user
Base.classes.hardware.__str__ = obj_name_hardware
Base.classes.hardware_owner.__str__ = obj_name_hardware_owner

Это работает и решает мою первоначальную проблему, но есть ли лучший способ сделать это?


person jspin    schedule 13.09.2014    source источник


Ответы (1)


Если вы используете Python 2, добавьте __unicode__ к своим моделям.

Если вы используете Python 3 — добавьте __str__.

person Joes    schedule 14.09.2014
comment
Ах да, _str_ в python 3, а не в юникоде, спасибо!! Но я не определил никаких классов моделей, так как их создает automap. Пожалуйста, обратитесь к моему обновлению выше, чтобы увидеть, как я добавляю _str_ def - person jspin; 14.09.2014