有没有一种简单的方法可以从数据库中转储UTF-8数据?
我知道这个命令:
manage.py dumpdata > mydata.json
但是我在文件 mydata.json 中得到的数据,Unicode 数据看起来像:
"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"
我想看到一个真正的 Unicode 字符串,比如全球卫星定位系统
(中文)。
在遇到类似问题后,我刚刚发现,xml 格式化程序可以正确处理 UTF8。
manage.py dumpdata --format=xml > output.xml
我不得不将数据从 Django 0.96 传输到 Django 1.3。在多次尝试转储/加载数据后,我终于成功使用了 xml。暂时没有副作用。
希望这会对某人有所帮助,因为我在寻找解决方案时已经登陆了这个线程..
django-admin.py dumpdata yourapp可以为此目的进行转储。
或者如果你使用 MySQL,你可以使用mysqldump命令转储整个数据库。
而且这个线程有很多方法可以转储数据,包括手动方法。
更新:因为 OP 编辑了问题。
要将 JSON 编码字符串转换为人类可读的字符串,您可以使用以下命令:
open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
您需要json.dump*()
在 Django 代码中找到调用并传递附加选项ensure_ascii=False
,然后对结果进行编码,或者您需要使用json.load*()
来加载 JSON,然后使用该选项转储它。
在这里,我为此写了一个片段。为我工作!
您可以创建自己的序列化程序,将ensure_ascii=False
参数传递给json.dumps
函数:
# serfializers/json_no_uescape.py
from django.core.serializers.json import *
class Serializer(Serializer):
def _init_options(self):
super(Serializer, self)._init_options()
self.json_kwargs['ensure_ascii'] = False
然后注册新的序列化程序(例如在您的应用程序__init__.py
文件中):
from django.core.serializers import register_serializer
register_serializer('json-no-uescape', 'serializers.json_no_uescape')
然后你可以运行:
manage.py dumpdata --format=json-no-uescape > output.json
由于您提供了一个被接受的好答案,因此应该考虑 python 3区分 text 和 binary data,因此必须以二进制模式打开这两个文件:
open("mydata-new.json","wb").write(open("mydata.json", "rb").read().decode("unicode_escape").encode("utf8"))
否则,AttributeError: 'str' object has no attribute 'decode'
将引发错误。
此问题已在Django 3.1中针对 JSON 和 YAML 进行了修复。
我通常在我的 Makefile 中添加下一个字符串:
.PONY: dump
# make APP=core MODEL=Schema dump
dump:
@python manage.py dumpdata --indent=2 --natural-foreign --natural-primary ${APP}.${MODEL} | \
python -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" \
> ${APP}/fixtures/${MODEL}.json
标准 django 项目结构可以,如果您的项目结构不同,请修复。
这是一个新的解决方案。
我刚刚在 github 上分享了一个仓库:django-dump-load-utf8。
但是,我认为这是 django 的一个错误,希望有人可以将我的项目合并到 django。
一个不错的解决方案,但我认为修复 django 中的错误会更好。
manage.py dumpdatautf8 --output data.json
manage.py loaddatautf8 data.json
import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, 'r').read().decode('string-escape')
codecs.open(dst, "wb").write(source)
我遇到了同样的问题。在阅读了所有答案后,我想出了Ali和darthwade的混合答案:
manage.py dumpdata app.category --indent=2 > categories.json
manage.py shell
import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, "rb").read().decode('unicode-escape')
codecs.open(dst, "wb","utf-8").write(source)
在 Python 3 中,我必须以二进制模式打开文件并解码为unicode-escape。当我以写入(二进制)模式打开时,我还添加了utf-8 。
我希望它有帮助:)
这是来自 djangoproject.com 的解决方案
你去设置那里有一个“使用 Unicode UTF-8 来支持全球语言”,在“语言”-“管理语言设置”-“更改系统区域设置”-“区域设置”中的框。如果我们应用它并重新启动,那么我们会从 Python 中获得一个合理的、现代的、默认编码。
djangoproject.com
This solution worked for me from @Julian Polard's post.
Basically just add -Xutf8
in front of py
or python
when running this command:
python -Xutf8 manage.py dumpdata > data.json
Please upvote his answer as well if this worked for you ^_^