You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django QuerySet中实现子查询,获取含Cart quantity的Food详情

解决方案

你的问题出在food模型本身没有quantity字段,这个字段属于cart模型,直接从food表查询自然拿不到。下面提供两种解决方式:

方式一:不修改现有模型,用子查询注入quantity字段

使用Django的Subquery和OuterRef,将当前用户对应商品的quantity字段关联到food的查询结果中:

from django.db.models import Subquery, OuterRef

# 先获取当前用户的购物车商品ID列表
cart_food_ids = cart.objects.filter(user_id=request.user.username).values('food_id')

# 查询商品详情并注入对应的quantity
food_details = food.objects.filter(food_id__in=cart_food_ids).annotate(
    quantity=Subquery(
        cart.objects.filter(
            user_id=request.user.username,
            food_id=OuterRef('food_id')
        ).values('quantity')[:1]
    )
).values('food_id', 'food_name', 'food_price', 'delivery_time', 'quantity')

方式二:优化模型设计(推荐)

将cart模型中的food_id字段改为ForeignKey关联food模型,这更符合Django ORM的设计规范,查询也更高效:

# 修改后的cart模型
class cart(models.Model):
    user_id = models.CharField('User ID', max_length=50)
    # 替换原food_id为ForeignKey
    food = models.ForeignKey(food, on_delete=models.CASCADE, verbose_name='Food')
    quantity = models.IntegerField('Quantity', default=1)

修改模型后,直接从cart表关联查询商品信息即可:

from django.db.models import F

food_details = cart.objects.filter(user_id=request.user.username).annotate(
    food_id=F('food__food_id'),
    food_name=F('food__food_name'),
    food_price=F('food__food_price'),
    delivery_time=F('food__delivery_time')
).values('food_id', 'food_name', 'food_price', 'delivery_time', 'quantity')

这样查询得到的结果就包含你需要的所有字段了。

内容的提问来源于stack exchange,提问作者Sugam Neupane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:27:34