如何使用Django模型中存储的字段搜索数据库匹配的用户数据
错误原因
你代码的核心问题出在ORM过滤条件的写法上:
owner是关联User表的外键字段,该字段的存储值是User对象的主键ID,而你传入的searched是前端提交的用户名字符串,二者类型完全不匹配,所以查询不到任何结果。- 要基于外键关联表的字段做过滤,需要用Django ORM的双下划线跨表查询语法,指定关联表的具体字段做匹配。
修正方案
根据你的需求有两种可选写法:
方案1:直接查询符合用户名条件的所有Journal记录
如果你需要的结果是「所有者用户名匹配搜索关键词的所有Journal」,直接修改过滤条件即可:
def search_user(request): """Search for users.""" if request.method == "POST": searched = request.POST["searched"] # 跨owner外键查询关联User表的username字段,模糊匹配搜索关键词 usernames = Journal.objects.filter(owner__username__icontains=searched) context = {"searched": searched, "usernames": usernames} return render(request, "journals/search_user.html", context)
你可以直接通过返回的Journal对象访问关联用户的所有字段,比如journal.owner.email、journal.owner.last_login等。
方案2:先查询匹配的用户,再反向关联Journal
如果你需要的结果是「用户名匹配搜索关键词的所有用户」,同时要获取用户的Journal数据,可以保留你最初的User表查询逻辑,Django会自动生成外键反向引用:
def search_user(request): """Search for users.""" if request.method == "POST": searched = request.POST["searched"] usernames = User.objects.filter(username__icontains=searched) context = {"searched": searched, "usernames": usernames} return render(request, "journals/search_user.html", context)
在模板中可以直接通过user.journal_set.all获取该用户创建的所有Journal记录,不需要额外修改查询逻辑。
内容的提问来源于stack exchange,提问作者Mshane
相关产品推荐
相关产品推荐

