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

