2013-03-16 153 views
0

我有一個對象,我需要使用循環插入幾次。每循環迭代我改變一些字段值。 我的代碼是:帶金字塔的平板插件

@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() 

該代碼只插入一行。由於某些原因,我無法直接在「try block」中設置循環。 我做錯了什麼?

回答

3

DBSession.add向會話中添加一個對象(顧名思義) - 當時沒有發出SQL查詢,.add只是讓會話意識到該對象。

您可以繼續修改對象的屬性,直到提交會話 - 無論您將對象添加到會話的次數,只有一行將被添加到數據庫中。

可能能夠做一些巧妙的會話刷新操作,但是,嚴肅地說,爲什麼不爲每行創建一個單獨的對象呢?這就是ORM的一般工作原理。

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)