QuerySet输出异常:如何获取单个字段值而非QuerySet对象
解决QuerySet返回值而非单个字符串的问题
我明白你的痛点——values_list()返回的始终是QuerySet集合对象(哪怕只有一条结果),所以你看到的是<QuerySet ['S00009']>而不是预期的纯字符串'S00009'。下面给你直接的解决方案,还能顺便简化你重复冗余的代码:
核心问题拆解
values_list(flat=True)本质是返回一个查询集,哪怕只有一条数据也会被包裹在QuerySet里。要拿到单个字符串值,你需要直接获取模型实例的字段值,而不是用查询集方法。
解决方案1:用get()获取单个实例的字段值
如果你能保证每个coid对应唯一的OrgLevel记录,直接用get()获取实例后再取对应字段:
# 以selectedaccesslevel为3的场景为例 datareducecode = OrgLevel.objects.get(coid__exact=owner.coid.coid).slevel
这样就能直接拿到slevel字段的纯字符串值了。
处理记录不存在的情况
如果有可能出现coid找不到对应OrgLevel的情况,记得加异常捕获避免报错:
try: org_level = OrgLevel.objects.get(coid__exact=owner.coid.coid) datareducecode = org_level.slevel except OrgLevel.DoesNotExist: datareducecode = 'No Match on Coid'
解决方案2:用first()获取第一个结果的字段值
如果同一个coid可能对应多个OrgLevel记录,但你只需要第一个结果,就用first():
org_level = OrgLevel.objects.filter(coid__exact=owner.coid.coid).first() if org_level: datareducecode = org_level.slevel else: datareducecode = 'No Match on Coid'
优化你的重复代码
你现在写了多个重复的if request.method == 'POST'判断,完全可以用字典映射来简化,让代码更整洁易维护:
def submitted(request): owner = User.objects.get(formattedusername=request.user.formattedusername) checkedlist = request.POST.getlist('report_id') access_request_date = timezone.now() selectedaccesslevel = request.POST.get('accesslevelid') selectedphi = request.POST.get('phi') # 建立accesslevel与对应数据库字段的映射关系 level_field_map = { '3': 'slevel', '4': 'blevel', '5': 'rlevel', '6': 'dlevel', '7': 'zlevel' # 注意:这里替换成你数据库中对应Z{Coid}的真实字段名,原代码的写法是错误的 } datareducecode = 'No Match on Coid' if request.method == 'POST' and selectedaccesslevel in level_field_map: try: # 根据coid获取OrgLevel实例 org_level = OrgLevel.objects.get(coid=owner.coid.coid) # 通过映射关系拿到对应字段的值 datareducecode = getattr(org_level, level_field_map[selectedaccesslevel]) except OrgLevel.DoesNotExist: datareducecode = 'No Match on Coid' # 批量保存请求记录 for i in checkedlist: requestsave = QVFormAccessRequest( ntname=owner.formattedusername, first_name=owner.first_name, last_name=owner.last_name, coid=owner.coid.coid, facility=owner.facility, title=owner.title, report_id=i, accesslevel_id=selectedaccesslevel, phi=selectedphi, access_beg_date=access_request_date, datareducecode=datareducecode ) requestsave.save() return JsonResponse({'is_success': True})
关键注意点
- 原代码中
selectedaccesslevel == '7'时的values_list('f"Z{Coid}"', flat=True)是错误写法,你需要替换成数据库中实际存在的字段名(比如zlevel或者你自定义的对应字段)。 - 使用
get()方法时必须处理DoesNotExist异常,否则当找不到对应记录时会抛出服务器500错误。
内容的提问来源于stack exchange,提问作者student101
相关产品推荐
相关产品推荐

