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

This code inserts only single row. For some reasons I can't set loop directly in "try block" begins. What i'm doing wrong?

4

1 に答える 1

3

DBSession.addセッションにオブジェクトを追加します (名前が示すように)。その時点では、SQL クエリは発行され.addず、セッションにオブジェクトを認識させるだけです。

セッションがコミットされるまで、オブジェクトのプロパティを変更し続けることができます。オブジェクトをセッションに追加した回数に関係なく、データベースに追加されるのは 1 行だけです。

巧妙なセッション フラッシュを使用して、実行しようとしていることができる場合がありますが、真剣に、行ごとに個別のオブジェクトを作成してみませんか? これが 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)
于 2013-03-16T20:18:30.410 に答える