mrjoes/flask-admin — pull request #280 by sumpfgottheit (2013-08-12 18:30:29+00:00)
Title: process inherited primary keys correctly

When using joined table inheritance (http://docs.sqlalchemy.org/en/latest/orm/inheritance.html), it is common practice to name the pk-property the same like the pk-property of the parent. (At least the documentation says so) The child-property ist a pk itself and has a foreign-key relationship to the pk-property of the parent.

Example:

class BaseWahl(Model):
__tablename__ = 'basewahlen'

id = Column(Integer, primary_key=True, autoincrement=True)
discriminator = db.Column(db.String(50))

__mapper_args__ = {
'polymorphic_identity':'basewahl',
'polymorphic_on': discriminator
}

class Wahl(BaseWahl):
__tablename__ = 'wahlen'

id = Column(Integer, ForeignKey('basewahlen.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity':'wahl',
}

`AdminModelConverter.convert()` does not allow Properties with multiple columns, but will raise a `TypeError`. I changed it into the following way:

- If
- more than 1 column for the property
- all columns are primary keys
- only *one* does not have a Foreign key
- only one column corresponds to the current model
- select the column, that corresponds to the current model

I applied the same code to `ModelView.scaffold_list_columns()` and extended it, the primary key in this special constellation actually is *not* ignored, even if it has a foreign key property, so it can be displayed using `column_display_pk = True`.

This solution actually works for me. I do not have enough insight into *Flask-Admin* and definitely even less into *sqlalchemy* to think my solution is the correct one for every situation, but it may be something to think about.