Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2009 12:26:26

kawaikunee
От:
Зарегистрирован: 2009-05-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy, фильтрация данных, получаемых по внешнему ключу

Вот модель:

sections=sa.Table('sections',meta.metadata,
sa.Column('id',sa.types.Integer,primary_key=True),
sa.Column('parent_id',sa.types.Integer, sa.ForeignKey('sections.id')),
sa.Column('name',sa.types.String(255)),
sa.Column('active',sa.types.Boolean),
)
class Sections(object):
def __repr__(self):
return self.name
orm.mapper(
Sections,sections,
properties={
'parent':orm.relation(
Sections,remote_side=[sections.c.id], backref=orm.backref('childrens')
)
},
)
articles=sa.Table('articles',meta.metadata,
sa.Column('id',sa.types.Integer,primary_key=True,autoincrement=True),
sa.Column('section_id',sa.types.Integer, sa.ForeignKey('sections.id')),
sa.Column('name',sa.types.String(255),default=u'',nullable=False),
sa.Column('active',sa.types.Boolean,default=0,nullable=False),
)
class Articles(object):
def __repr__(self):
return self.name
orm.mapper(
Articles,articles,
properties={'section':orm.relation(Sections,backref=orm.backref('articles'))},
)
Хочу получить одну запись, из которой потом буду получать сведения по внешнему ключу.
section=Session.query(model.Sections).get(id)
Как построить запрос, чтобы section.articles были только те, где active были только True?



Офлайн

#2 Окт. 29, 2009 15:11:18

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy, фильтрация данных, получаемых по внешнему ключу

:)
Как вариант вместо relation использовать dynamic_loader.
В данном случае указать lazy=dynamic для backref.
Т.е. что-то вроде:
orm.mapper(
Articles,articles,
properties={'section':orm.relation(Sections,backref=orm.backref('articles', lazy='dynamic'))},
)
Теперь можно будет написать:
section.articles.filter_by(active=True).all()
или дописать к классу свойство (property) в котором это скрыть.
class Articles(object):
def __repr__(self):
return self.name
articles = property(lambda self: self._articles.filter_by(active=True).all())
orm.mapper(
Articles,articles,
properties={'section':orm.relation(Sections,backref=orm.backref('_articles', lazy='dynamic'))},
)
Как-то так…



Офлайн

#3 Окт. 30, 2009 10:22:36

kawaikunee
От:
Зарегистрирован: 2009-05-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy, фильтрация данных, получаемых по внешнему ключу

Премного благодарен. Все работает как надо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version