2014-01-22 80 views
1

我有以下型号:Django的模型ForeignKey的关系

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) 

可以有多个订单,同车。 而每个订单将有多个订单项目。 我想在同一个购物车中获得状态='退款'的所有订单商品。 我怎样才能得到这个?

产生额外的信息:我使用的美味馅饼我的API调用

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() 

例子:

{ 
"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" 
       } 
      } 
     ] 
    } 
] 

}

回答

0

一个选项:

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 

(或你可以使用itertools.groupby如果你精通iterables。)

+0

我没有购物车ID。我唯一的价值是状态='REFUND' – reevh

+0

@reevh,然后我有点困惑你想要得到什么。 *所有*'OrderItem's'status ='REFUND''?或者是由'所有*购物车组成的'OrderItem'列表的列表。添加一个例子来澄清。 –

+0

状态='REFUND'的OrderItem列表,按购物车分组。示例添加到问题 – reevh