如何获取Django中Profile模型当前登录用户的所有布尔类型字段值
解决方案
报错原因是F表达式使用错误:F表达式的作用是引用模型自身的字段值做运算或同表字段比较,构造时不需要传入关键字参数,同时你的查询逻辑存在偏差:你需要先定位到当前登录用户对应的Profile实例,而非直接对布尔字段和User实例做无意义的比对。
正确实现步骤
- 第一步:获取当前用户对应的Profile实例
因为Profile和User是一对一关联,你可以直接通过request.user.profile获取关联实例,为了避免用户未初始化Profile的情况,也可以用get_or_create兜底:user_profile, created = Profile.objects.get_or_create(user=request.user) - 第二步:提取所有布尔类型字段值
两种实现方式按需选择:- 动态自动提取(推荐,后续新增布尔字段无需修改代码)
遍历Profile的元字段信息,筛选类型为BooleanField的字段批量取值:
def page(request): user_profile, created = Profile.objects.get_or_create(user=request.user) booleans_list = [] for field in Profile._meta.get_fields(): if field.get_internal_type() == "BooleanField": # 如果只需要字段值,直接append(getattr(user_profile, field.name))即可 booleans_list.append({ "field_name": field.verbose_name or field.name, "value": getattr(user_profile, field.name) }) context = {"Booleans_List": booleans_list} return render(request, "page.html", context)- 手动指定字段取值
如果你的布尔字段固定不会新增,可以直接手动取值,逻辑更简单:
def page(request): user_profile, created = Profile.objects.get_or_create(user=request.user) booleans_list = [ user_profile.first_boolean, user_profile.second_boolean, user_profile.third_boolean ] context = {"Booleans_List": booleans_list} return render(request, "page.html", context) - 动态自动提取(推荐,后续新增布尔字段无需修改代码)
内容的提问来源于stack exchange,提问作者Van
相关产品推荐
相关产品推荐

