TextField принимает Unicode в Джанго - PullRequest
1 голос
/ 22 января 2011

Я пытаюсь сохранить строку, содержащую символы, порядковый номер которых не находится в диапазоне (128), в базу данных.Поле объявлено как TextField в модели, и когда я вызвал метод save (), было выдано исключение:

File "/Library/Python/2.6/site-packages/django/db/models/base.py", line 434, in save self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/Library/Python/2.6/site-packages/django/db/models/base.py", line 500, in save_base rows = manager.using(using).filter(pk=pk_val)._update(values)
File "/Library/Python/2.6/site-packages/django/db/models/query.py", line 491, in _update return query.get_compiler(self.db).execute_sql(None)
File "/Library/Python/2.6/site-packages/django/db/models/sql/compiler.py", line 861, in execute_sql cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/Library/Python/2.6/site-packages/django/db/models/sql/compiler.py", line 717, in execute_sql sql, params = self.as_sql()
File "/Library/Python/2.6/site-packages/django/db/models/sql/compiler.py", line 826, in as_sql val = field.get_db_prep_save(val, connection=self.connection)
File "/Library/Python/2.6/site-packages/django/db/models/fields/subclassing.py", line 28, in inner return func(*args, **kwargs)
File "/Library/Python/2.6/site-packages/django/db/models/fields/subclassing.py", line 28, in inner return func(*args, **kwargs)
File "/Library/Python/2.6/site-packages/django/db/models/fields/__init__.py", line 276, in get_db_prep_save return self.get_db_prep_value(value, connection=connection, prepared=False)
File "/Library/Python/2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner return func(*args, **kwargs)
File "/Library/Python/2.6/site-packages/django/db/models/fields/__init__.py", line 652, in get_db_prep_value value = self.get_prep_value(value)
File "/Library/Python/2.6/site-packages/django/db/models/fields/__init__.py", line 647, in get_prep_value return self.to_python(value)
File "/Library/Python/2.6/site-packages/django/db/models/fields/__init__.py", line 610, in to_python if not ansi_date_re.search(value):
TypeError: expected string or buffer

Вот что я сделал:

str_unicode = str.encode('utf-8')
m = MyModel.new(str = str_unicode)
m.save()

Итак, что должноЯ делаю, чтобы включить совместимость с юникодом?

Обновлено : в настоящее время я использую sqlite3 для разработки, python 2.6.1 и Django 1.2.4 на Mac

Ответы [ 4 ]

3 голосов
/ 23 января 2011

utf-8 - это , а не юникод!Эта строка:

str_unicode = str.encode('utf-8')

делает напротив того, что вы намеревались.Он принимает Unicode и преобразует его в UTF-8.Не делай этого.

2 голосов
/ 23 января 2011

Ваша проблема не с TextField вообще. Если вы посмотрите на код, указанный в трассировке, вы вызываете исключение из метода DateField to_python. Вы можете увидеть соответствующий код здесь . По сути, похоже, что вы передаете что-то неуместное в качестве ввода в другое поле вашей модели.

Урок, который необходимо выучить: ВСЕГДА ПРОЧИТАЙТЕ ВНИМАНИЕ!

В качестве примечания: если вы действительно хотите что-то принудительно кодировать в Python, вызовите встроенный тип unicode:

str_unicode = unicode(str)

Использование метода encode для преобразования в UTF-8 делает что-то совершенно другое.

0 голосов
/ 04 февраля 2011

Причина в том, что я не загружал настройки mysql в конфигурации базы данных django, что не связано с проблемой юникода, которую я представил.

Конфигурация должна быть такой:

   DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql', 
           'NAME': 'db',
           'USER': 'xxx',
           'PASSWORD': 'xxx', 
           'HOST': 'localhost',
           'PORT': '3306', 
           'OPTIONS' : {
              "init_command": "SET storage_engine=INNODB",
              'read_default_file': '/etc/my.cnf',
           }
       }
   }
0 голосов
/ 22 января 2011

Django отлично работает с юникодом.

Но если ваши входные данные не будут преобразованы должным образом, у вас будут проблемы. Например: у меня было много проблем со старой базой данных MyISAM, неправильно заполненной скриптом php Проверьте ваш ввод.

Какую базу данных вы используете? Какой уровень питона?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...