Джанго, обновление с модели - PullRequest
2 голосов
/ 09 февраля 2010

Предположим, у меня есть маленькая модель:

class Deal(models.Model):
    purchases = models.IntegerField(default=0)#amount of purchases so far

    increase_purchases(self,to_add):
        self.update( purchases =self.purchases + to_add)

, когда я пытаюсь использовать эту модель увеличения_покупок из оболочки:

>>> x = Deal.objects.get(id=1)
>>> x.increase_purchases(4)
AttributeError: 'Deal' object has no attribute 'update'

Как мне написать правильную функцию для моделичто я могу обновить выбранные запросы покупок, как я хочу?

Ответы [ 4 ]

3 голосов
/ 09 февраля 2010

Исходя из вашего примера и описания, вы, вероятно, хотите что-то вроде этого:

class Deal(models.Model):        
    purchase_count = models.IntegerField(default=0)

    def purchase(self, quantity=1):
       self.purchase_count = self.purchase_count + quantity

Я согласен с Игнасио; изменить объект, а затем сохранить его. Итак, в оболочке:

> great_deal = Deal.objects.get(id=1)
> great_deal.purchase(4)
> great_deal.save()
> # or w/o an explicite argument it will record a single purchase
> # great_deal.purchase()

Да, я немного переименовал вещи в модели Deal. Это просто показалось более наглядным.

1 голос
/ 06 апреля 2015

В Джанго 1.6.2. Обнаружил это поведение и использовал «фильтр», затем обновление работает, как и ожидалось. Например, Students.objects.select_for_update (). Filter (id = 3) .update (оценка = 10)

Просто к сведению: Если вы не обрабатываете транзакции, изменение каждого поля отдельно с помощью save () может привести к несогласованности данных в многопоточной среде. Ко времени, когда threadA вызывает save () для модели, другой поток B мог бы изменить поля модели и сохранить. В этом случае поток А должен прочитать обновленную модель и изменить.

1 голос
/ 09 февраля 2010

Или используйте выражение + = для кода уборщика:

class Deal(models.Model):        
    purchase_count = models.IntegerField(default=0)

    def purchase(self, quantity=1):
       self.purchase_count += quantity
1 голос
/ 09 февраля 2010

Измените соответствующие поля, затем вызовите save() в экземпляре.

...