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

Django多模型过滤问题:如何获取指定用户收藏的商品

解决Django多模型关联下的收藏商品查询问题

我来帮你搞定这个收藏商品查询的bug~先看看你代码里的问题,再一步步修正:

问题根源

你写的favorite_product = Product.objects.filter(id=favorite__.id)有两个明显的错误:

  1. favorite__ = Favorite.objects.filter(user=id)返回的是多个Favorite对象组成的QuerySet,不是单个对象,所以QuerySet根本没有id这个属性,直接访问会报错。
  2. 就算是单个Favorite对象,favorite__.id是Favorite自身的主键,不是关联的Product的id,逻辑上完全不对。

正确的解决方案

有两种简洁的方式可以拿到指定用户收藏的所有Product:

方法1:通过收藏记录获取商品ID列表(直观易懂)

先拿到该用户的所有收藏记录,提取出关联的商品ID,再用这些ID查询商品:

def profile(request):
    id = request.COOKIES['id']
    order__ = Order.objects.filter(sender=id)
    profile__ = Profile.objects.get(id=id)
    # 获取当前用户的所有收藏记录
    favorites = Favorite.objects.filter(user=id)
    # 提取所有收藏记录关联的商品ID,flat=True返回一维列表
    product_ids = favorites.values_list('product_id', flat=True)
    # 根据ID列表查询商品
    favorite_product = Product.objects.filter(id__in=product_ids)
    
    return render(request, 'shop/profile/profile.html', {'order': order__, 'profile': profile__, 'favorite_product': favorite_product})

方法2:Django跨表关联查询(更简洁高效)

利用Django的ORM跨表查询能力,直接通过Product反向关联Favorite的条件过滤:

def profile(request):
    id = request.COOKIES['id']
    order__ = Order.objects.filter(sender=id)
    profile__ = Profile.objects.get(id=id)
    # 直接过滤出被当前用户收藏的商品
    favorite_product = Product.objects.filter(favorite__user=id)
    
    return render(request, 'shop/profile/profile.html', {'order': order__, 'profile': profile__, 'favorite_product': favorite_product})

这里的favorite__user表示:找到所有关联了Favorite对象,且该Favorite对象的user字段等于id的Product。Django会自动帮你处理跨表关联,比手动查ID列表更高效。

额外的优化建议

  1. 避免KeyError:request.COOKIES['id']如果Cookie里没有id会直接抛异常,建议用request.COOKIES.get('id')并做判断:
    user_id = request.COOKIES.get('id')
    if not user_id:
        # 这里可以跳转到登录页或者返回提示
        return render(request, 'shop/profile/login_required.html')
    
  2. 处理对象不存在的情况:Profile.objects.get(id=id)如果找不到对应用户会抛DoesNotExist异常,建议用get_object_or_404:
    from django.shortcuts import get_object_or_404
    profile__ = get_object_or_404(Profile, id=user_id)
    
  3. 模板字段修正:你模板里的{{ item.fa_name }}应该是{{ item.title_fa }}吧?因为你的Product模型里定义的是title_fa字段,别写错了哦~

内容的提问来源于stack exchange,提问作者Hesam Aghajani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:58:31