2017-07-01 24 views
1

私はショッピングカートを構築しています。多くのオブジェクトを1つの書式で更新する

class Product(models.Model): 
    name = models.CharField(max_length=64) 
    description = models.TextField(blank=True) 
    unit = models.CharField(max_length=16) 
    price_per_unit = models.DecimalField(max_digits=11, decimal_places=2) 
    image = StdImageField(default="default.jpg", variations={ 
     'thumbnail': {"width": 100, "height": 100, "crop": True} 
    }) 

    def __str__(self): 
     return self.name 


class ShoppingCartItem(models.Model): 
    user = models.ForeignKey(django_settings.AUTH_USER_MODEL, related_name='cart_items', on_delete=models.CASCADE) 
    product = models.ForeignKey(Product, on_delete=models.CASCADE) 
    quantity = models.PositiveIntegerField(default=1) 

    # Update the quantity of an item in the shopping cart 
    def update_quantity(self, quantity): 
     if quantity <= 0: 
      # If user sets quantity to 0 or less, delete the item. 
      self.remove_item() 
     else: 
      self.quantity = quantity 
      self.save() 

    # Remove item from the shopping cart 
    def remove_item(self): 
     self.delete() 

    def get_ext_total(self): 
     return Decimal(self.product.price_per_unit * self.quantity) 

私はUXは一度に多くのShoppingCartItemのためのテキストボックスを経由して量を更新することができるようにしたい:私はProductモデルとShoppingCartItemモデルを持っています。私はフォームセットとインラインフォームセットを見てきましたが、一度に多くのオブジェクトを更新するのではなく、オブジェクトの作成や各オブジェクト内のManyToMany関係に適しているようです。以下は私のショッピングカートの例である:

Shopping Cart List

これを行うことについて移動する最良の方法は何ですか?

答えて

0

データベースを更新するために複数のクエリを作成することはお勧めできません。また、1回の呼び出しで複数のオブジェクト属性を更新する必要があります。しかし、属性値が異なる場合、ORMで簡単に行うことはできません。

あなたは以下のいずれかを実装することができます。

シングル更新

は一般的に、主に使用して単一の更新はデータベースに非常に高速であり、更新の数がそれほど高くない場合は、これは十分です。 transaction.atomicすべての更新を使用してトランザクションに

from django.db import transaction 
    def update_cart(user_id, cart): 
     with transaction.atomic(): 
      for product_id, quantity in cart.items(): 
       ShoppingCartItem.objects.get(user__id=user_id, product__id=product_id).update(quantity=quantity) 

を使用して

def update_cart(user_id, cart): 
    for product_id, quantity in cart.items(): 
     ShoppingCartItem.objects.get(user__id=user_id, product__id=product_id).update(quantity=quantity) 

単一の更新は、1つのトランザクションにグループ化されます。これにより、膨大な数の更新がある場合、データベースの対話が最適化されます。

関連する問題