Reputation: 912
I am trying to get the total no. of a sold item after payment is made.
When the order is paid ordered = models.BooleanField(default=False) become True
I wrote the code which got me a little close to what I want but I am getting the total no. of orders with the item not the total quantity of the order.
I have also tried to add the quantity in the ordered item but I get a 'Item' object has no attribute 'orderitem'
so I commented it for your reference
Here is the item model
class Item(models.Model):
title = models.CharField(max_length=100)
def __str__(self):
return self.title
@property
def count_sold(self):
return self.orderitem_set.filter(ordered=True).count()
# return self.OrderItem.quantity_set.filter(ordered=True).count()
Here is the OrderItem model:
class OrderItem(models.Model):
ordered = models.BooleanField(default=False)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
Here is the order model
class Order(models.Model):
items = models.ManyToManyField(OrderItem)
Here is the template
<tr>
td>No. of Sold:</td>
<td>{{ item.count_sold }}</td>
</tr>
Full Traceback
Traceback (most recent call last):
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\core\handlers\base.py", line 145, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\core\handlers\base.py", line 143, in _get_response
response = response.render()
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\response.py", line 106, in render
self.content = self.rendered_content
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\response.py", line 83, in rendered_content
content = template.render(context, self._request)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 171, in render
return self._render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
return self.nodelist.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 937, in render
bit = node.render_annotated(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
return self.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
return self.nodelist.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 937, in render
bit = node.render_annotated(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
return self.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 937, in render
bit = node.render_annotated(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
return self.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\defaulttags.py", line 309, in render
return nodelist.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 937, in render
bit = node.render_annotated(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
return self.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\defaulttags.py", line 209, in render
nodelist.append(node.render_annotated(context))
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 904, in render_annotated
return self.render(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 987, in render
output = self.filter_expression.resolve(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 671, in resolve
obj = self.var.resolve(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 796, in resolve
value = self._resolve_lookup(context)
File "C:\Users\Ahmed\Desktop\Project 4.3\venv\lib\site-packages\django\template\base.py", line 837, in _resolve_lookup
current = getattr(current, bit)
File "C:\Users\Ahmed\Desktop\Project 4.3\core\models.py", line 79, in count_sold
return self.OrderItem.quantity_set.filter(ordered=True).count()
AttributeError: 'Item' object has no attribute 'OrderItem'
[03/Jul/2020 19:40:51] "GET /usersheet/Ahesham HTTP/1.1" 500 207341
Upvotes: 0
Views: 126
Reputation: 311
What you need to do is aggregate the quantity over all orderitems. Something like this should work:
from django.db.models import Sum
return self.orderitem_set.filter(ordered=True).aggregate(total=Sum('quantity'))['total']
Upvotes: 2