I have the following models:
class Order(models.Model):
objects = OrderManager()
order_number = models.CharField(max_length=20, editable=False, unique=True,
default=get_unique_order_number)
user = models.ForeignKey(User)
cart = models.ForeignKey(Cart)
class OrderItem(models.Model):
objects = OrderItemManager()
order = models.ForeignKey(Order, related_name="items")
product = models.ForeignKey(Product)
quantity = models.PositiveSmallIntegerField()
price = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
tax = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
ITEM_STATUS = (
('PENDING', 'Pending'),
('REFUND', 'Refund'),
('CANCEL', 'Cancel'),
)
status = models.CharField(max_length=10, choices=ITEM_STATUS,
default="PENDING")
class Cart(models.Model):
user = models.ForeignKey(User)
creation_date = models.DateTimeField(auto_now_add=True)
modification_date = models.DateTimeField(auto_now=True, auto_now_add=True)
is_check_out = models.BooleanField(default=False)
There can be multiple orders with same cart. And each order will have multiple order items. I want to get all OrderItems with status = 'Refund' in the same cart. How can i get that?
Additonal Info: I am using tasty-pie for my api calls
class RefundItemAuthorization(Authorization):
def read_list(self, object_list, bundle):
print 'Read List RefundItemAuthorization'
if bundle.request.user.is_admin:
return object_list.all()
else:
raise Unauthorized("Only admin user can access this.")
class OrderItemRefundResource(ModelResource):
product = fields.ForeignKey('store.api.ProductResource', 'product', full=True)
class Meta:
queryset = OrderItem.objects.filter(status='REFUND')
resource_name = 'item_refund'
include_resource_uri = False
allowed_methods = ['get']
limit = 0
authentication = SessionAuthentication()
authorization = RefundItemAuthorization()
Example :
{
"cart": [
{
"id": 1,
"orderitem": [
{
"id": 22,
"product": {
"brand_name": "A",
"cost_price": "0.69",
"description": "XXXX"
}
},
{
"id": 33,
"product": {
"brand_name": "B",
"cost_price": "0.50",
"description": "XXXXX"
}
}
]
}
]
}
One option:
import defaultdict from collections
d = defaultdict(list)
for item in OrderItem.objects.filter(status='REFUND'):
d[item.order.cart.id].append(item)
print(d)
# d is a dict from cart id to a list of OrderItems
(Or you could use itertools.groupby
if you are savvy with iterables.)