Странные символы вместо кириллицы c Django - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь добавить данные в БД с помощью внешнего скрипта. В этом сценарии я сначала создаю список Model элементов, а затем добавляю их в БД методом bulk_create.

from shop.models import SpeciesOfWood

species_of_wood = [
    SpeciesOfWood(title="Ель"),
    SpeciesOfWood(title="Кедр"),
    SpeciesOfWood(title="Пихта"),
    SpeciesOfWood(title="Лиственница")
]
SpeciesOfWood.objects.bulk_create(species_of_wood)

Этот код хорошо работает с точки зрения добавления данные в БД, но idk, что происходит с значениями Я хотел добавить, вот скриншот:

screenshot

Я уже пытался добавьте:

  • # -*- coding: utf-8 -*-
  • u префикс к title значениям

Но это ничего не изменило.

UPD 1

Я пытался создавать модели, например SpeciesOfWood.objects.create(...), и это тоже ничего не меняет.

UPD 2

Я пытался добавить данные кириллицы c через админ-панель, и все работает нормально, данные выглядят так, как я хотел. Я до сих пор не знаю, почему данные, добавленные через скрипт, добавлены с неправильной кодировкой, но через админ-панель все в порядке.

UPD 3

Я пытался использовать SpeciesOfWood.objects.create(...) через python manage.py shell, и это хорошо работает, если я напишу это от руки. Кроме того, это может быть полезно, я выполняю этот скрипт фиктивных данных, используя этот код:

>>> python manage.py shell
>>> exec(open("my_script.py").read())

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Ответ заключается в том, как я выполняю скрипт. Кодировка по умолчанию зависит от платформы (что бы ни возвращает locale.getpreferredencoding ()) ... . Я ошибся, думая, что кодировка по умолчанию при чтении файла - UTF-8.

0 голосов
/ 05 февраля 2020

Это выглядит подозрительно, как будто ваша база данных неверно сконфигурирована, или программное обеспечение, с которым вы читаете данные, обратно: символы в табличном изображении соответствуют вашим исходным данным, закодированным в UTF-8, затем декодированным в Windows -1251 («устаревшая» кодировка кириллицы c, хотя википедия говорит мне, что она остается чрезвычайно популярной):

>>> print("Ель".encode('utf-8').decode('windows-1251'))
Ель

Это означает, что база данных настроена так, что считыватель принимает Windows Кодировки -1251, или программное обеспечение, которое вы используете для просмотра содержимого базы данных, предполагает, что база данных возвращает данные в любой кодировке, установленной в системе (а среда вашего рабочего стола настроена в cyrilli c с использованием windows -1251 / cp1251).

В любом случае это не выглядит как проблема с входом для меня, поскольку данные изначально кодируются / хранятся как UTF-8.

...