Mehran Bahrami
Mehran Bahrami

Reputation: 139

How to get Total price from two different Size

I have 3 models :

class Stock(models.Model):
    amount_size_1 = models.PositiveIntegerField(default=0)
    amount_size_2 = models.PositiveIntegerField(default=0)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="product", related_name="pro")
    price_size_1 = models.FloatField(default=0,null=True)
    price_size_2 = models.FloatField(default=0,null=True)

class OrderItem(models.Model):
    product = models.ForeignKey(Stock, on_delete=models.SET_NULL, null=True)
    is_ordered = models.BooleanField(default=False)
    date_added = jmodels.jDateField(auto_now=True)
    date_ordered = jmodels.jDateField(null=True)
    quantity = models.IntegerField(default=0, verbose_name='quantity')
    size = models.IntegerField(default=0, verbose_name='size')

class Order(models.Model):
    ref_code = models.CharField(max_length=15)
    owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
    is_ordered = models.BooleanField(default=False)
    items = models.ManyToManyField(OrderItem, related_name='item')
    date_ordered = jmodels.jDateField(auto_now=True,null=True)
    created_on_time = models.TimeField(auto_now_add=True,null=True)

    def get_cart_total(self):         
        return sum([item.quantity*item.product.price_size_1 for item in self.items.all()])

My problem is that in def get_cart_total how filter for each item by their size I have 3 size (1,2,3), size 1 and 3 price is price_size_1 and size 2 is price_size_2 How can I solve this problem? or make if in Bracket? (in class OrderItem.size only get 3 numbers 1,2or3)

Upvotes: 0

Views: 108

Answers (2)

Dean Elliott
Dean Elliott

Reputation: 1323

I would recommend you change your models so they are more flexible and can support unlimited sizes. I don't know what your sizes are so you can change them. For example:

class Stock(models.Model):
    SMALL = 'Small'
    MEDIUM = 'Medium'
    LARGE = 'Large'
    XLARGE = 'X-Large'

    PRODUCT_SIZES = [
        (SMALL, 'Small'),
        (MEDIUM, 'Medium'),
        (LARGE, 'Large'),
        (XLARGE, 'X-Large'),
    ]

    size = models.CharField(choices=PRODUCT_SIZES)
    price = models.FloatField(default=0, null=True)
    quantity = models.PositiveIntegerField(default=0)
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        verbose_name="product",
        related_name="stock"
    )


class OrderItem(models.Model):
    stock_item = models.ForeignKey(Stock, on_delete=models.SET_NULL, null=True)
    is_ordered = models.BooleanField(default=False)
    date_added = jmodels.jDateField(auto_now=True)
    date_ordered = jmodels.jDateField(null=True)
    quantity = models.IntegerField(default=0, verbose_name='quantity')

    # Make a copy of price from `Stock` to maintain history of sale price
    # Do this in the save method or before saving
    price_per_item = models.FloatField(default=0, null=True)

    @property
    def total(self):
        return self.quantity * self.price_per_item

class Order(models.Model):
    ref_code = models.CharField(max_length=15)
    owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
    is_ordered = models.BooleanField(default=False)
    items = models.ManyToManyField(OrderItem, related_name='item')
    date_ordered = jmodels.jDateField(auto_now=True,null=True)
    created_on_time = models.TimeField(auto_now_add=True,null=True)

    def get_size_totals(self):
        size_totals = {}
        for item in self.items.all():
            size = item.stock_item.size
            if size is in size_totals:
                size_totals[size] = size_totals[size] + item.total
                continue
            size_totals[size] = item.total

        # {'Small': 51.20, 'Medium': 24.50, ...}
        return size_totals

    def get_cart_total(self):
        return sum(
            [item.total for item in self.items.all()]
        )

I left a comment about copying over the price, so if you change the price, you still maintain a copy of the sold price at that time. With more time you should make the price a better implementation to allow for promotional sales, etc and maybe even create an invoice table.

Upvotes: 1

Gurmessa Lemma
Gurmessa Lemma

Reputation: 103

def get_cart_total(self,size):  
    if size == 1:
        return sum([item.quantity*item.product.price_size_1 for item in self.items.all()])
    elif size == 2:
        return sum([item.quantity*item.product.price_size_2 for item in self.items.all()])
    elif size == 3:
        return sum([item.quantity*item.product.price_size_3 for item in self.items.all()])

Upvotes: 0

Related Questions