Найти - Пользователи
Полная версия: Вывод информации об объекте sqlalchemy
Начало » Базы данных » Вывод информации об объекте sqlalchemy
1
Diman3654
Сейчас осваиваю 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?
GreyZmeem
http://python.su/forum/post/132743/
GreyZmeem
Diman3654
В django все решалось переопределением метода unicode, а тут это не работает
Потому что в django метод __str__ у модели берет значение из __unicode__, если это возможно.
https://github.com/django/django/blob/1.7/django/db/models/base.py#L464
Diman3654
GreyZmeem
Я находил этот пост, когда гуглил эту проблему. Мне это не помогло, может быть конечно я не правильно понял, что вы предлагаете.
GreyZmeem
Diman3654,

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

Попробуйте сделать:
return '<User %s>' % (self.nickname.encode('utf-8'))

Diman3654
Пробовал, пишет UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd0 in position 7: ordinal not in range(128)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB