метод итерации по определенным столбцам sqlalchemy модели?

Я пытался выяснить, как выполнить итерации по списку столбцов, определенных в модели SQLAlchemy. Я хочу это для записи некоторой сериализации и копирую методы в несколько моделей. Я не могу просто выполнить итерации по obj.__dict__ так как это содержит много SA определенные объекты.

Любой знает о способе просто добраться id и desc имена от следующего?

class JobStatus(Base):
    __tablename__ = 'jobstatus'

    id = Column(Integer, primary_key=True)
    desc = Column(Unicode(20))

В этом маленьком случае я мог легко создать a:

def logme(self):
    return {'id': self.id, 'desc': self.desc}

но я предпочел бы что-то, что автоматически генерирует dict (для больших объектов).

90
задан Nathaniel Jones 23 August 2019 в 01:59
поделиться

2 ответа

Вы можете использовать следующую функцию:

def __unicode__(self):
    return "[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4]))

Она исключит атрибуты SA magic , но не исключит отношения. Таким образом, в основном он может загружать зависимости, родителей, детей и т. Д., Что определенно нежелательно.

Но на самом деле это намного проще, потому что если вы наследуете от Base , у вас есть атрибут __ table __ , так что вы можете:

for c in JobStatus.__table__.columns:
    print c

for c in JobStatus.__table__.foreign_keys:
    print c

См. Как обнаружить свойства таблицы из сопоставленного объекта SQLAlchemy - аналогичный вопрос.

Правка Майка: См. Такие функции, как Mapper.c и Mapper.mapped_table . Если используется версия 0.8 и выше, см. Также Mapper.attrs и связанные функции.

Пример для Mapper.attrs :

from sqlalchemy import inspect
mapper = inspect(JobStatus)
for column in mapper.attrs:
    print column.key
76
ответ дан 24 November 2019 в 07:01
поделиться

Вы можете получить список определенных свойств из сопоставителя. В вашем случае вас интересуют только объекты ColumnProperty.

from sqlalchemy.orm import class_mapper
import sqlalchemy

def attribute_names(cls):
    return [prop.key for prop in class_mapper(cls).iterate_properties
        if isinstance(prop, sqlalchemy.orm.ColumnProperty)]
61
ответ дан 24 November 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: