Найти - Пользователи
Полная версия: SQAlchemy - single table наследование
Начало » Базы данных » SQAlchemy - single table наследование
1
PooH
Есть довольно глубокая иерархия классов, которую хочется отобразить на одну таблицу. При этом некотрые атрибуты должны мапится только у листовых классов. Немогу найти способ это сделать :( Через include_properties и exclude_properties достичь этого не получается
j2a
Давай так, ты изложи проблему не касаясь SQLAlchemy. Т.е. приведи модель иерархии, таблицу, как ты хочешь чтобы классы иерархии отображались в таблицу, как атрибуты соотносятся с колонками таблицы, лучше с примерами. А мы попробуем придумать, как в такой ситуации что-нибудь сделать с SQLAlchemy.

P.S. Очень часто бывает так, что подробно, с примерами изложив проблему, ты сам приближаешься к ответу на вопрос :) Эффект “резиновой уточки” :)
PooH
Есть такая иерархия:
Объект недвижимости
Земельный участок
Строение
Комплекс
Здание
Этаж
Помещение
У всех практически одинаковый набор атрибутов, поэтому хочу отмапить их всех на одну таблицу. Примерно такую:
 идентификатор
тип
код
описание
владелец
особые условия
площадь
высота потолка
этажность
...
Большинство атрибутов должно быть у всех классов. Но есть несколько атрибутов, которые должны быть только у конкретных классов внизу иерархии, например у Помещения - ‘высота потолка’, у здания - ‘этажность’. Когда я использую схему отсюда Single Table Inheritance то получаю атрибут ‘высота потолка’ у всех классов в иерархии.
j2a
Ситуация такая. Если у базового класса есть атрибуты, сопоставленные с колонками таблицы, то их не уберешь из детей.

Пример: http://dumpz.org/2665/ В этом примере у экземпляров Structure не будет атрибута storeys_number, но у экземпляров Room будут атрибуты и storeys_number и ceiling_height, за счет того, что оба эти атрибута есть у его родителя - Bulding.

Собсно демонстрация:
>>> from rlt import *
>>> make_engine()
<<< Engine(sqlite:///rlt.db)
>>> create_sample_data()

>>> r0 = Room.query.first()
>>> r0.ceiling_height
<<< 2.7000000000000002
>>> r0.storeys_number

>>> s0 = Structure.query.first()
>>> s0.storeys_number

>>> s0.ceiling_height
---------------------------------------------------------------------------
<type 'exceptions.AttributeError'> Traceback (most recent call last)

/home/j2a/<ipython console> in <module>()

<type 'exceptions.AttributeError'>: 'Structure' object has no attribute 'ceiling_height'
PooH
j2a
Ситуация такая. Если у базового класса есть атрибуты, сопоставленные с колонками таблицы, то их не уберешь из детей.
Ну мне как раз надо было убрать из родителей :) Огромное спасибо, exclude_properties - работает, хотя и не очень удобно в использовании. Еще раз спасибо, особенно за код. Жаль рейтинг не работает.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB