Reputation: 1
I have an object that I need to insert several times using loop. Every loop iteration I change some fields values. My code is:
@view_config(route_name="be.bautocredits.rates.add",
request_method="POST",
permission="admin",
renderer="json")
def _add_rates(self):
_ = self.request.translate
controls = self.request.POST.items()
schema = AutocreditRateSchema()
try:
schema.deserialize(controls)
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.min_cost_currency = Currency.by_rid(self.request.POST.get('min_cost_currencies_rid'))
rate.max_cost_currency = Currency.by_rid(self.request.POST.get('max_cost_currencies_rid'))
rate.min_currency = Currency.by_rid(self.request.POST.get('min_currencies_rid'))
rate.max_currency = Currency.by_rid(self.request.POST.get('max_currencies_rid'))
rate.manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid'))
rate.autocredit.updated = datetime.datetime.now()
_cars_rids = list(set(self.request.POST.getall('_cars_rid')))
if _cars_rids:
for _cars_rid in _cars_rids:
rate.car = Car.by_rid(_cars_rid)
DBSession.add(rate)
else:
DBSession.add(rate)
except colander.Invalid, e:
return dict(errors=dict(e.asdict().items()+dict(status_bar=_(u'Check errors')).items()))
return dict()
This code inserts only single row. For some reasons I can't set loop directly in "try block" begins. What i'm doing wrong?
Upvotes: 0
Views: 316
Reputation: 12427
DBSession.add
adds an object to session (as the name implies) - at that time no SQL queries are emitted, .add
just makes the session aware of the object.
You can continue to modify the object's properties until the session is committed - regardless of how many times you've added the object to the session only one row will be added to the database.
You may be able to do what you're trying to do with some clever session flushing, but, seriously, why not just create a separate object for each row? That's how ORMs work in general.
def _add_rates(self):
_ = self.request.translate
controls = self.request.POST.items()
schema = AutocreditRateSchema()
try:
schema.deserialize(controls)
_cars_rids = list(set(self.request.POST.getall('_cars_rid')))
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'))
min_cost_currency = Currency.by_rid(self.request.POST.get('min_cost_currencies_rid'))
max_cost_currency = Currency.by_rid(self.request.POST.get('max_cost_currencies_rid'))
min_currency = Currency.by_rid(self.request.POST.get('min_currencies_rid'))
max_currency = Currency.by_rid(self.request.POST.get('max_currencies_rid'))
manufacturer = Manufacturer.by_rid(self.request.POST.get('_manufacturers_rid'))
if _cars_rids:
for _cars_rid in _cars_rids:
rate = AutocreditRate(autocredit=autocredit, carshow=carshow, ...)
rate.car = Car.by_rid(_cars_rid)
rate.autocredit.updated = datetime.datetime.now()
DBSession.add(rate)
else:
rate = AutocreditRate(autocredit=autocredit, carshow=carshow, ...)
rate.autocredit.updated = datetime.datetime.now()
DBSession.add(rate)
Upvotes: 3