Reputation: 139
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
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
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