如何在查询集中获取外键字段的字段

1 投票
1 回答
4736 浏览
提问于 2025-04-18 01:39

我有以下这些模型:

 class Product(models.Model):
    objects = ProductManger()
    name = models.CharField(max_length=200)
    brand_name = models.CharField(max_length=100)
    description = models.TextField()
    image_url = models.CharField(max_length=200)

 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)

 class CartItem(models.Model):
    objects = CartItemManager()
    cart = models.ForeignKey(Cart)
    product = models.ForeignKey(Product)
    quantity = models.PositiveSmallIntegerField(default=1)

我想要获取一个购物车中所有商品的JSON数据(条件是is_check_out = False),为此我写了以下代码:

  def get_user_cart(self, request, **kwargs):
    self.method_check(request, allowed=['get'])
    self.is_authenticated(request)

    cart, created = Cart.objects.get_or_create(user__exact=request.user, is_check_out=False)

    if not created:
        items = CartItem.objects.filter(cart=cart)

        d = []
        for item in items:
            print item.product
            d.append(model_to_dict(item))
        data = [ { 'cart_id':cart.id, 'items':d} ]
    else:
        data = [ { 'cart_id':cart.id, 'items':[]} ]
    data_string = json.dumps(data, cls=DjangoJSONEncoder)
    return HttpResponse(data_string, mimetype='application/json')

这段代码给了我以下的JSON数据:

 [
      {
        "items": [
            {
                "product": 48,
                "price": "0.69",
                "tax": "0.09",
                "cart": 169,
                "note": null,
                "id": 467,
                "quantity": 1
            }
         ],
        "cart_id": 169
     }
    ]

但我想要的结果是这样的:

[
    {
        "items": [
            {
                "product": {
                    "id": 1,
                    "name": "apple",
                    "image_url": "http://localhost"
                },
                "price": "0.69",
                "tax": "0.09",
                "cart": 169,
                "note": null,
                "id": 467,
                "quantity": 1
            }
        ],
        "cart_id": 169
    }
]

更新: 我把我的get_user_cart改成了下面这样,以达到我想要的效果;如果有更好的方法,请大家评论或者回答。

def get_user_cart(self, request, **kwargs):
    self.method_check(request, allowed=['get'])
    self.is_authenticated(request)       
    cart, created = Cart.objects.get_or_create(user__exact=request.user, is_check_out=False)        
    if not created:
        items = CartItem.objects.select_related('product').filter(cart=cart)
        d = []            
        for item in items:
            d.append({
                      "product": {
                            "id": item.product.id,
                            "name": item.product.name,
                            "image_url": item.product.image_url
                        }, 
                      'price': item.price,
                      'tax': item.tax,
                      'cart':item.cart.id,
                      'note': item.note,
                      'id':item.id,
                      'quantity':item.quantity                          
                      })
        data = [ { 'cart_id':cart.id, 'items':d} ]
    else:
        data = [ { 'cart_id':cart.id, 'items':[]} ]
    data_string = json.dumps(data, cls=DjangoJSONEncoder)
    return HttpResponse(data_string, mimetype='application/json')

任何帮助都很感激

1 个回答

1

与其使用 filter,不如使用 select_related,这样查询的时候就能把相关的数据也一起获取到。

根据你的代码,你只需要在循环中改一行代码:

items = CartItem.objects.select_related('product').filter(cart=cart)

撰写回答