2014-06-23 62 views
3

所以我一直嘗試更新外鍵模型的字段時遇到了問題。我試圖通過另一個模型的方法更新字段,但它似乎沒有正常工作,因爲我運行我的tests.py時得到不正確的值。我正在嘗試更新「total_purchased」的值。這裏是什麼,我基本上是試圖完成一個例子:Django外鍵的模型字段沒有正確更新

我使用Django 1.6.4

如果問題太長,總結的東西了,有以下2行允許嗎?我是一個Django的類模型方法中做這件事:

Ex: Model.ForeignKeyModel.field = some_value 
    Model.ForeignKeyModel.save() 

通過以下3種型號:

class Meal (models.Model): 
    name = models.CharField(max_length=255) 
    total_purchased = models.IntegerField(default=0, validators=[MaxValueValidator(capacity)]) 
    capacity = models.IntegerField(default=500) 

class Item (models.Model): 
    cart = models.ForeignKey(Cart) 
    meal = models.ForeignKey(Meal) 
    quantity = models.IntegerField(validators=[MinValueValidator(0)], default=0) 

class Cart (models.Model): 
    delivery = models.ForeignKey(DeliveryInfo) 
    subscription = models.BooleanField(default=False) 
    customer = models.ForeignKey(User) 

    def add(self, meal, quantity): 
     """ Dual Add/Remove from cart method, (quantity replaces current quantity) """ 
     item = Item.objects.get_or_create(cart=self, meal=meal)[0] 
     remaining_capacity = item.meal.capacity - item.meal.total_purchased 

     # Meal exists on our cart, so proceed with adding or removing 
     if quantity <= remaining_capacity: 

      if quantity == 0: 
       # Add back whatever quantity the user didn't buy 
       item.meal.total_purchased = 0 
       item.meal.save() 

       # Remove entire item from cart (quantity = 0) 
       item.delete() 

      elif quantity == item.quantity: 
       # Do nothing if cart quantity equals current quantity 
       pass 

      else: 
       if quantity < item.quantity: 
        # Decrement total purchased 
        item.meal.total_purchased -= (item.quantity - quantity) 
        item.meal.save() 

       else: 
        # Increment total_purchased by the quantity we're adding to the cart 
        item.meal.total_purchased += (quantity - item.quantity) 
        item.meal.save() 

      # Update the Cart 
      item.quantity = quantity 
      item.save() 

      remaining_capacity = item.meal.capacity - item.meal.total_purchased 

    else: 
     exceeded = abs(remaining_capacity - quantity) 
     raise ValidationError("Your cart exceeds the total remaining quantity by {0}!".format(exceeded)) 

在更新它的工作原理周圍的第一次,但似乎忽略下一個添加到購物車方法調用和我結束了我的tests.py如下: self.assertEqual(item.total_purchased,2) Asse田:1 = 2

我不知道這是否是因爲車更新正在發生在tests.p或者如果我以某種方式錯誤地保存數據。任何幫助將不勝感激謝謝。

如這裏要求是我tests.py在那裏我從運行測試:

customer = User.objects.filter(pk=1)[0] 
delivery_info = DeliveryInfo.objects.filter(owner=customer)[0] 
cart_order = CartOrder.objects.create(owner=customer, delivery=delivery_info, subscription=False) 

# Query the meal_items 
curry_item = Meal.objects.get(pk=1) 
burger_item = Meal.objects.get(pk=2) 

# Add some meal items to our cart, the cart_order add method creates Items 
cart_order.add(curry_item, 2) 
cart_order.add(burger_item, 1) 

self.assertEqual(burger_item.total_purchased, 1) 

# Removing one item from the cart 
cart_order.add(curry_item, 1) 

# Doing nothing to the cart 
cart_order.add(curry_item, 1) 

**這是它無法正確地更新值:**

# Adding an item to the cart 
cart_order.add(burger_item, 2) 
self.assertEqual(burger_item.total_purchased, 2) 
+0

您能分享您的購物車的相應代碼/視圖嗎? – Jingo

+0

@Jingo添加了我的tests.py部分,我正在運行代碼。我還沒有設置任何意見。謝謝。 – njamaleddine

回答

3

這是因爲您正在使用的模型實例沒有被更新。
您第一次打電話get_or_create它創建Item並使用Mealmeal=meal而第二次它得到Item並且不使用相同的Meal實例。

既然你已經擁有的meal作爲參數的實例,可以替換item.mealmeal,你應該看到你想要的結果。或者,您可以在添加後重新加載burger_item或任何餐點。

你真的應該看看使用F()表達式來做你自己增加,因爲它們只在數據庫端執行,並且可以幫助防止競爭條件。請注意,使用F()表達式將要求您重新加載Meal以查看它的新值。

在一個側面說明,注意

# Update the Cart 
item.quantity = quantity 
item.save() 

其中quantity == 0你刪除Item因爲這將重新創建Item的情況後,被調用。

+0

非常感謝,我其實並沒有意識到我錯誤地縮進了item.quantity部分,也沒有意識到通過調用item.meal它不會調用同一個實例。 非常有幫助的回答! – njamaleddine

相關問題