Django查询报错:'unicode' object has no attribute 'objects' 求助
解决Django高级搜索中的'unicode'对象错误问题
嘿,这个问题我太熟了!你遇到的是典型的变量命名冲突问题,咱们一步步拆解来看:
错误原因
你把从请求里获取的作者搜索关键词赋值给了变量author,但这个变量名刚好和你的Django模型名(就是定义在models.py里的那个author类)重名了!这就导致原来代表数据库模型的author被覆盖成了一个字符串(也就是错误里提到的unicode对象),字符串肯定没有objects属性呀,所以调用author.objects.filter()的时候就会报错。
出版商搜索的问题也是一模一样的——你用了和模型名相同的变量名publisher,覆盖了模型类。
修复方案
只需要把搜索关键词的变量名改一下,避免和模型名重复就行,同时注意Django模型的命名规范(通常首字母大写,比如Author、Publisher,如果你的模型是小写的,保持一致即可):
修改后的代码示例
def searchadva(request): error = False authors = [] publishers = [] # 处理作者搜索 if 'author' in request.GET and request.GET['author']: # 重命名变量,避免和模型名冲突 search_author = request.GET['author'] if not search_author: error = True elif len(search_author) > 20: error = True else: # 这里用正确的模型名(假设你的模型是Author,首字母大写) authors = Author.objects.filter(first_name__icontains=search_author) # 处理出版商搜索,同理修改变量名 if 'publisher' in request.GET and request.GET['publisher']: search_publisher = request.GET['publisher'] if not search_publisher: error = True elif len(search_publisher) > 20: error = True else: publishers = Publisher.objects.filter(name__icontains=search_publisher) # 后续返回页面上下文的代码... return render(request, 'your_template.html', {'authors': authors, 'publishers': publishers, 'error': error})
额外小提示
- 变量命名尽量带明确含义,比如
search_author就比author更清晰,能从根源避免这类冲突。 - 可以用
request.GET.get('author', '')替代直接取request.GET['author'],这样即使参数不存在也不会抛出KeyError,代码更健壮。
内容的提问来源于stack exchange,提问作者Prashant Bhardwaj
相关产品推荐
相关产品推荐

