Django Dumpdata UTF-8 (Unicode)
سؤال
هل هناك طريقة سهلة لتفريغها UTF-8 بيانات من قاعدة بيانات؟
أنا أعرف هذا الأمر:
manage.py dumpdata > mydata.json
لكن البيانات التي حصلت عليها في ملف myData.json ، تبدو بيانات Unicode:
"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"
أود أن أرى سلسلة يونيكود حقيقية مثل 全球卫星定位系统
(صينى).
المحلول
django-admin.py dumpdata yoursapp يمكن أن تفريغ لهذا الغرض.
أو إذا كنت تستخدم MySQL ، فيمكنك استخدام mysqldump أمر لتفريغ قاعدة البيانات بأكملها.
و هذا الموضوع لديه العديد من الطرق لتفريغ البيانات ، بما في ذلك الأساليب اليدوية.
تحديث: لأن OP قام بتحرير السؤال.
للتحويل من سلسلة ترميز JSON إلى سلسلة قابلة للقراءة البشرية ، يمكنك استخدام هذا:
open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
نصائح أخرى
بعد الكفاح مع مشكلات مماثلة ، لقد وجدت للتو ، أن Formatter XML يتعامل مع UTF8 بشكل صحيح.
manage.py dumpdata --format=xml > output.xml
اضطررت إلى نقل البيانات من Django 0.96 إلى Django 1.3. بعد العديد من المحاولات باستخدام بيانات التفريغ/التحميل ، نجحت أخيرًا في استخدام XML. لا توجد آثار جانبية الآن.
آمل أن يساعد هذا شخصًا ما ، حيث هبطت في هذا الموضوع عند البحث عن حل ..
تحتاج إما إلى العثور على المكالمة json.dump*()
في رمز Django ومرر الخيار الإضافي ensure_ascii=False
ثم قم بتشفير النتيجة بعد ، أو تحتاج إلى استخدامها json.load*()
لتحميل 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)
يمكنك إنشاء المسلسل الخاص بك الذي يمر 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
فقط اتركه هنا:
./manage.py dumpdata --indent=2 core.item | python3 -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" > core/fixtures/item.json