2010-02-09 2 views
2

предположить, у меня есть эта маленькая модель:Django, обновление от модели

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) 

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

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

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

ответ

3

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

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

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

+0

, но насколько я знаю, сохранение будет сохранять новый экземпляр, в то время как я хочу обновить существующий. приветствует – Hellnar

+0

Он будет создавать новую запись только в том случае, если PK является None или еще не существует в базе данных. В противном случае он обновит существующую запись с помощью PK. –

1

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

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

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

Да, но как вы делаете эту работу в параллельной ситуации, когда другие могут делать то же самое? – Alper

1

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

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

Смежные вопросы