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

Django多对多关联下,如何根据标签字符串过滤饮品列表?

解决Django多对多关联标签过滤的错误问题

你遇到的错误是因为过滤查询语句写法错误,多对多关联的过滤逻辑没有正确匹配标签字符串。

错误原因

原查询语句DrinkRecipe.objects.filter(drink_tag__drinkrecipe=self.kwargs['tag'])试图通过反向关联的drinkrecipe字段(默认是关联模型的主键id)来匹配字符串标签,这会导致Django尝试把字符串转成数字类型,从而抛出"Field 'id' expected a number but got 'Summer'"的错误。

修正方案

正确的过滤应该针对Tag模型中的drink_tag字段(存储标签字符串的字段),通过多对多关联的正向查询来匹配:

修正后的视图代码

class DrinksFilteredListView(ListView):
    model = DrinkRecipe
    context_object_name = 'drinks'
    
    def get_queryset(self):
        # 匹配Tag模型中drink_tag字段等于URL传递的标签字符串
        return DrinkRecipe.objects.filter(drink_tag__drink_tag=self.kwargs['tag'])
    
    def get_context_data(self, **kwargs):
        context= super().get_context_data(**kwargs)
        context['tags'] = Tag.objects.all()
        context['tastes'] = TagTaste.objects.all()
        context['bottles'] = Bottle.objects.all()
        return context

可选优化:忽略标签大小写

如果需要忽略标签的大小写差异(比如匹配"summer"和"Summer"),可以使用__iexact查询:

return DrinkRecipe.objects.filter(drink_tag__drink_tag__iexact=self.kwargs['tag'])

内容的提问来源于stack exchange,提问作者Thomas Doll-Datema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:52:10