Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 3, 2014 10:28:11

Diman3654
Зарегистрирован: 2014-09-03
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод информации об объекте sqlalchemy

Сейчас осваиваю flask и sqlalchemy, по урокам (http://habrahabr.ru/post/196810/). Возникла одна проблемка, помогите разрешить пожалуйста.

Есть модель с переопределённым методом repr:

from app import db
ROLE_USER = 0
ROLE_ADMIN = 1
class User(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    nickname = db.Column(db.String(64), index = True, unique = True)
    email = db.Column(db.String(120), index = True, unique = True)
    role = db.Column(db.SmallInteger, default = ROLE_USER)
    def __repr__(self):
        return '<User %r>' % (self.nickname)
В обычном случае, когда nickname на английском проблем нет, но есть nickname будет на латинице, то возникает проблема, что за место <User Михан>, мы получаем <User u'\u041c\u0438\u0445\u0430\u043d'>.
В django все решалось переопределением метода unicode, а тут это не работает. Подскажите как это можно исправить или это можно решить только перехом на python3?

Офлайн

#2 Сен. 3, 2014 15:04:50

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Вывод информации об объекте sqlalchemy

Офлайн

#3 Сен. 3, 2014 15:08:00

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Вывод информации об объекте sqlalchemy

Diman3654
В django все решалось переопределением метода unicode, а тут это не работает
Потому что в django метод __str__ у модели берет значение из __unicode__, если это возможно.
https://github.com/django/django/blob/1.7/django/db/models/base.py#L464

Офлайн

#4 Сен. 3, 2014 18:30:47

Diman3654
Зарегистрирован: 2014-09-03
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод информации об объекте sqlalchemy

GreyZmeem
Я находил этот пост, когда гуглил эту проблему. Мне это не помогло, может быть конечно я не правильно понял, что вы предлагаете.

Офлайн

#5 Сен. 3, 2014 19:06:44

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Вывод информации об объекте sqlalchemy

Diman3654,

Потому что %r означает:
1. Что у объекта self.nickname будет вызван метод __repr__
2. Т.к. self.nickname содержит unicode, а __repr__ должен вернуть string, то ему не остаётся ничего другого как сделать .encode('unicode-escape') для вашей строки. Потому что он ничего не знает о том, какую кодировку вы собираетесь использовать.

Попробуйте сделать:

return '<User %s>' % (self.nickname.encode('utf-8'))

Офлайн

#6 Сен. 3, 2014 19:13:49

Diman3654
Зарегистрирован: 2014-09-03
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод информации об объекте sqlalchemy

Пробовал, пишет UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd0 in position 7: ordinal not in range(128)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version