如何在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
相关产品推荐
相关产品推荐

