Django查询集转换为列表时,表情符号的mySQL unicode解码错误

问题描述

我使用的是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]

其中“名称”是您需要迭代的模型字段。