Форум сайта python.su
Есть объект, который нужно много раз вставить в базу, изменяя одно из полей.
rate = AutocreditRate() rate.autocredit = Autocredit.by_rid(self.request.POST.get('_autocredits_rid')) rate.carshow = Carshow.by_rid(self.request.POST.get('_carshows_rid')) rate.currency = Currency.by_rid(self.request.POST.get('_currencies_rid')) # ---------------------- rate.manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid')) for _cars_rid in _cars_rids: rate.car = Car.by_rid(_cars_rid) DBSession.add(rate) DBSession.flush()
Офлайн
Если хочется много объектов, то наверное надо так
autocredit = Autocredit.by_rid(self.request.POST.get('_autocredits_rid')) carshow = Carshow.by_rid(self.request.POST.get('_carshows_rid')) currency = Currency.by_rid(self.request.POST.get('_currencies_rid')) manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid')) for _cars_rid in _cars_rids: rate = AutocreditRate() rate.autocredit = autocredit rate.carshow = carshow rate.currency = currency rate.manufacturer = manufacturer rate.car = Car.by_rid(_cars_rid) DBSession.add(rate)
Отредактировано bismigalis (Март 16, 2013 16:49:14)
Офлайн
Предлагаю посмотреть слайд по профайлингу начиная с 15-го
python profile
Офлайн
bismigalisЕсть заготовка объекта и с этой заготовкой нужно провести операции вставки с разными вариациями некоторых полей. Таких циклов, как представлено выше, может быть не 1 и не 2 а побольше. Поэтому нужен именно такой вариант.
Если хочется много объектов, то наверное надо так
Офлайн
Такой вариант не сработает, маппер на то и маппер, что инстанс в памяти мапится на истанс в базе.
Можно наверное копировать объект из заготовки. Хотя это будет не очень эффективно если тысячи объектов, как подсказывает sakal, и тогда только спускаться на уровень core или SQL, как показано в презентации.
Отредактировано bismigalis (Март 16, 2013 11:51:52)
Офлайн
Решение
в модели
def __copy__(self): _rate = AutocreditRate() for prop in object_mapper(self).iterate_properties: if (isinstance(prop, ColumnProperty) or isinstance(prop, RelationshipProperty) and prop.secondary): setattr(_rate, prop.key, getattr(self, prop.key) if prop.key!='rid' else None) return _rate
_cars_rids = list(set(self.request.POST.getall('_cars_rid'))) for i, _cars_rid in enumerate(_cars_rids): rate.car = Car.by_rid(_cars_rid) if not i: DBSession.add(rate) else: new_rate = copy.copy(rate) DBSession.add(new_rate)
Отредактировано dorian (Март 16, 2013 15:28:20)
Офлайн
зачем такой оверхед делать? вынести константы в атрибуты класса нельзя чтоли?
Офлайн
sergeekнет здесь констант.
зачем такой оверхед делать? вынести константы в атрибуты класса нельзя чтоли?
Офлайн