Django通过用户名查询关联User的Account模型数据报错如何解决
错误原因分析
- 第一种写法错误:
values()默认仅返回当前Account模型的自有字段,你没有显式声明要返回关联User模型的字段,因此无法获取邮箱等关联数据。 - 第二种写法错误:首先Account模型本身没有
username字段,该字段属于关联的User模型,Django ORM跨关联查询需要使用双下划线__拼接关联字段名;其次你的模型类名为Account,代码中写的Accounts多了后缀s,也是错误原因之一,参数传递错误会引发查询逻辑异常。 - 第三种写法错误:
QuerySet[id]是按查询结果集的顺序取下标对应的数据,和Account的主键id没有任何关联,当有数据被删除后,结果集的下标和主键id会错位,必然会查询到错误数据。
解决方法
场景1:需要获取Account模型实例(适合在视图、模板中直接调用属性)
使用select_related提前联表加载关联的User数据,避免后续查询触发N+1问题,查询语法如下:
# 传入的username参数为用户提交的用户名字符串 account = Account.objects.select_related("user").get(user__username=username)
获取字段方式:
- Account自有字段:
account.balance、account.id - 关联User字段:
account.user.email、account.user.username、account.user.id
场景2:需要直接获取字典格式结果(适合接口返回等场景)
在values()参数中显式声明需要返回的关联User字段,使用user__字段名格式即可:
account_dict = Account.objects.values( "id", "balance", "user__id", "user__username", "user__email" ).get(user__username=username)
返回的字典中会直接包含user__email等关联字段的值。
补充注意
调用get()方法时建议添加异常捕获逻辑,避免用户名不存在时抛出DoesNotExist异常终止程序,也可以使用filter(user__username=username).first()替代get(),查询不到时会返回None更易处理。
内容的提问来源于stack exchange,提问作者RevTpark
相关产品推荐
相关产品推荐

