Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2008 14:13:39

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQAlchemy - single table наследование

Есть довольно глубокая иерархия классов, которую хочется отобразить на одну таблицу. При этом некотрые атрибуты должны мапится только у листовых классов. Немогу найти способ это сделать :( Через include_properties и exclude_properties достичь этого не получается



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

Офлайн

#2 Сен. 24, 2008 16:18:25

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQAlchemy - single table наследование

Давай так, ты изложи проблему не касаясь SQLAlchemy. Т.е. приведи модель иерархии, таблицу, как ты хочешь чтобы классы иерархии отображались в таблицу, как атрибуты соотносятся с колонками таблицы, лучше с примерами. А мы попробуем придумать, как в такой ситуации что-нибудь сделать с SQLAlchemy.

P.S. Очень часто бывает так, что подробно, с примерами изложив проблему, ты сам приближаешься к ответу на вопрос :) Эффект “резиновой уточки” :)



Отредактировано (Сен. 24, 2008 16:24:41)

Офлайн

#3 Сен. 25, 2008 11:41:45

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQAlchemy - single table наследование

Есть такая иерархия:

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



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

Отредактировано (Сен. 25, 2008 12:03:33)

Офлайн

#4 Сен. 25, 2008 15:45:53

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQAlchemy - single table наследование

Ситуация такая. Если у базового класса есть атрибуты, сопоставленные с колонками таблицы, то их не уберешь из детей.

Пример: 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'



Офлайн

#5 Сен. 26, 2008 05:37:17

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQAlchemy - single table наследование

j2a
Ситуация такая. Если у базового класса есть атрибуты, сопоставленные с колонками таблицы, то их не уберешь из детей.
Ну мне как раз надо было убрать из родителей :) Огромное спасибо, exclude_properties - работает, хотя и не очень удобно в использовании. Еще раз спасибо, особенно за код. Жаль рейтинг не работает.



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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version