Django出现Field 'id' expected a number报错,slug处理无效如何解决?
问题产生原因
- 路由传入视图的
user参数是用户名字符串(报错信息中的yoavlv就是用户名),而Add_Item的user字段是关联User表的外键,Django外键查询默认匹配关联表的主键id(数字类型),直接传入字符串会触发类型不匹配错误。 - 视图逻辑存在错误:你先调用
get_object_or_404(Add_Item, user=user)查询的是Add_Item实例,再拿这个实例作为过滤条件查Add_Item的逻辑完全冗余,且方向错误,你要实现的是查询指定用户的所有发布内容,不是先查一条发布内容再找同用户的内容。 - 之前用slug方案未生效的核心原因是没有明确指定查询匹配slug字段,还是默认用id匹配,所以同样会触发类型错误。
修复方案
直接调整视图查询逻辑即可,有两种常用写法:
- 先查询对应用户实例再过滤
from django.contrib.auth.models import User from django.shortcuts import get_object_or_404, render from .models import Add_Item def my_items(request, user): # 用传入的用户名匹配User表的username字段,拿到用户实例 target_user = get_object_or_404(User, username=user) # 过滤该用户发布的所有内容 items = Add_Item.objects.filter(user=target_user) return render(request, 'my_items.html', {"items": items})
- 直接跨表查询(无需单独查询User实例)
from django.shortcuts import render, Http404 from .models import Add_Item def my_items(request, user): # 双下划线指定关联User表的username字段进行匹配 items = Add_Item.objects.filter(user__username=user) if not items.exists(): raise Http404("未找到对应用户的发布内容") return render(request, 'my_items.html', {"items": items})
如果要继续使用slug方案,只需要确保路由传参是slug值,查询时用user__slug=传入的slug参数的写法明确指定匹配slug字段即可。
内容的提问来源于stack exchange,提问作者user16375265
相关产品推荐
相关产品推荐

