问题描述
我使用的是Django 1.11,python 3.6和MysqLclient 1.4.6。我需要将Django查询集转换为列表。 queryset中的对象有一个带有Unicode表情符号值的字段。 (请参阅:field=u'✅ This is the field value'
)MysqL中的特定表和字段正在使用utf8mb4_unicode_ci
编码。
当我运行qs_list = list(qs)
时,MysqL会抛出Unicode错误,我认为这是由查询集评估时字段中的表情符号引起的。
文件编码:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
查询集:
qs = Fake.objects.filter(..)
qs_list = list(qs)
错误:
<class 'UnicodeDecodeError'>
Exception: 'utf-8' codec can't decode byte 0xed in position 11: invalid continuation byte
File "/home/mysite/lib/python3.6/site-packages/django/db/models/query.py",line 250,in __iter__
self._fetch_all()
File "/home/mysite/lib/python3.6/site-packages/django/db/models/query.py",line 1121,in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/home/mysite/lib/python3.6/site-packages/django/db/models/query.py",line 53,in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
File "/home/mysite/lib/python3.6/site-packages/django/db/models/sql/compiler.py",line 899,in execute_sql
raise original_exception
File "/home/mysite/lib/python3.6/site-packages/django/db/models/sql/compiler.py",line 889,in execute_sql
cursor.execute(sql,params)
File "/home/mysite/lib/python3.6/site-packages/django/db/backends/utils.py",line 64,in execute
return self.cursor.execute(sql,params)
File "/home/mysite/lib/python3.6/site-packages/django/db/backends/MysqL/base.py",line 101,in execute
return self.cursor.execute(query,args)
File "/home/mysite/lib/python3.6/site-packages/MysqLdb/cursors.py",line 209,in execute
res = self._query(query)
File "/home/mysite/lib/python3.6/site-packages/MysqLdb/cursors.py",line 317,in _query
self._post_get_result()
File "/home/mysite/lib/python3.6/site-packages/MysqLdb/cursors.py",line 352,in _post_get_result
self._rows = self._fetch_row(0)
File "/home/mysite/lib/python3.6/site-packages/MysqLdb/cursors.py",line 325,in _fetch_row
return self._result.fetch_row(size,self._fetch_type)
是否有一个简单的解决方案或解决方法?如何在不评估查询集的情况下获取查询集中的对象列表?
解决方法
这很可能与编码有关,您需要按照this article
中的建议检查其他类型的编码关于对象列表-尝试对结果进行迭代以获取(例如)每个名称并将值存储在列表中:
qs = Fake.objects.filter(..)
qs_list = [x.name for x in qs]
其中“名称”是您需要迭代的模型字段。