Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2010 18:48:37

dorian
От:
Зарегистрирован: 2006-05-18
Сообщения: 79
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+MapperExtension

Есть две таблицы сategories и directories - где directories список объектов, а categories один из типов объектов. Таблицы связаны по categories.directories_rid = directories.rid. При создании новой записи в categories, нужно сначала вставить запись в directories, а потом значение поля rid из directories использовать для создания записи в categories. Как сделать руками - понятно. Нужно решить задачу по автоматическому созданию записей в directories посредством ORM. Задача сделать все красиво, без рук, так как типов объектов типа categories, products и тд. будет большое множество. Взгляд брошен на MapperExtension - before_insert:

class DirectoryRegisterField(MapperExtension):
def __init__(self, field, obj_type):
self.field = field
self.obj_type = obj_type

def before_insert(self, mapper, connection, instance):
new_directory = Directory(self.obj_type)
meta.Session.add(new_directory)
meta.Session.commit()
setattr(instance, self.field, new_directory.rid)
а далее
class Category(BaseModelObj):
"""Category
"""
__obj_type__ = 'CATEGORY'
__tablename__ = 'category'
__mapper_args__ = {'extension': [DirectoryRegisterField('directory_rid', __obj_type__), SlugField('slug')]}
...................................
и ничего, новая запись в directory не создается и получаю ошибки либо The transaction is closed или Session is already flushing (если использую flush)



Офлайн

#2 Янв. 9, 2010 15:13:38

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

SQLAlchemy+MapperExtension

:)
может я чего-то не понял, но чем не угодили ForeignKey?
и ещё, приводите пример который может (должен) работать



Офлайн

#3 Дек. 24, 2010 14:05:17

uhbif19
От:
Зарегистрирован: 2010-05-22
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+MapperExtension

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version