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

Django中如何通过关联模型过滤指定用户的收藏产品?

解决Django多模型关联过滤用户收藏产品的问题

嘿,我来帮你搞定这个收藏产品过滤的问题!你的代码里核心错误出在favorite_product = Product.objects.filter(id=favorite__.id)这一行,我给你拆解下问题,再提供两种靠谱的解决方案:

问题根源

favorite__ = Favorite.objects.filter(user=id)返回的是一个包含多个Favorite对象的QuerySet,不是单个对象。你直接访问.id是完全错误的——QuerySet根本没有这个属性,自然拿不到任何数据。


方案一:提取收藏产品ID列表后过滤

先从用户的所有收藏记录里提取关联的产品ID,再用__in参数过滤Product表:

def profile(request):
    # 先处理Cookie不存在的情况,避免KeyError崩溃
    try:
        user_id = request.COOKIES['id']
    except KeyError:
        # 这里可以根据业务需求跳转到登录页或者返回提示
        return redirect('login')
    
    order__ = Order.objects.filter(sender=user_id)
    # 建议用get_object_or_404替代get,避免用户不存在时抛出500错误
    from django.shortcuts import get_object_or_404
    profile__ = get_object_or_404(Profile, id=user_id)
    
    # 获取当前用户的所有收藏记录
    favorites = Favorite.objects.filter(user=user_id)
    # 提取所有收藏产品的ID
    favorite_product_ids = [fav.product.id for fav in favorites]
    # 过滤出对应的产品
    favorite_product = Product.objects.filter(id__in=favorite_product_ids)
    
    return render(request, 'shop/profile/profile.html', {
        'order': order__, 
        'profile': profile__, 
        'favorite_product': favorite_product
    })

方案二:用Django ORM反向关联查询(更高效简洁)

利用Django的关联查询特性,直接通过外键反向关联一步到位,减少数据库查询次数:

def profile(request):
    try:
        user_id = request.COOKIES['id']
    except KeyError:
        return redirect('login')
    
    order__ = Order.objects.filter(sender=user_id)
    profile__ = get_object_or_404(Profile, id=user_id)
    
    # 直接通过收藏记录的外键反向过滤产品,ORM自动处理关联
    favorite_product = Product.objects.filter(favorite__user=user_id)
    
    return render(request, 'shop/profile/profile.html', {
        'order': order__, 
        'profile': profile__, 
        'favorite_product': favorite_product
    })

这个写法的逻辑是:Product和Favorite是外键关联,所以可以用favorite__user来指定“被该用户收藏的产品”,ORM会自动生成高效的关联SQL,比方案一少一次数据库查询。


额外要注意的细节

  • 你的模板里写了{{ item.fa_name }},但Product模型里对应的字段是title_fa,要改成{{ item.title_fa }},否则模板会渲染出空值或者报错。
  • 生产环境中尽量避免直接用request.COOKIES['id'],最好用Django的认证系统(比如request.user)来获取当前用户,更安全可靠。

内容的提问来源于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 08:00:49