-
Добрый день!
Задача. Класс "Уроки" имеет ссылки на Учителей, Предметы, Классы и пр. Т.е. весь состоит из ForeignKey. Для удобства, хотел сохранить строчку в базе для поиска. Но сохраняется не строка, а ссылка на метод: <bound method Lesson.__str__ of <Lesson: Среда, 3 урок, Математика, 1В, k.212, Иванов П.С.>>
1. Как просто получить строку "Среда, 3 урок, Математика, 1В, k.212, Иванов П.С."?
2. Делаются ли запросы к базе внешних таблиц при приведённом методе __unicode__ ?
Привожу код:class Lesson(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(help_text='Поле для автозаполнения (не редактируется)', max_length=255, editable=False)
week_day = models.ForeignKey(WeekDay)
ringing_time = models.ForeignKey(RingingTime)
discipline = models.ForeignKey(Discipline)
teacher = models.ForeignKey(Teacher)
room = models.ForeignKey(Room)
school_class = models.ForeignKey(SchoolClass) #,to_field=SchoolClass.title)
is_active = models.BooleanField(help_text='Активно')
def __unicode__(self):
return smart_unicode("%s, %s, %s, %s, k.%s, %s" % (self.week_day.title, self.ringing_time.title, self.discipline.title, self.school_class.title, self.room.title, self.teacher.title))
def save(self, force_insert=False, force_update=False):
self.title = self.__unicode__
super(Lesson, self).save(force_insert, force_update) -
Как просто получить строку "Среда, 3 урок, Математика, 1В, k.212, Иванов П.С."?
Чтобы получить строковое (на самом деле, юникодное) представление вашего урока, надо написать:
unicode(lesson)Если это шаблон, то в нем простой вывод переменной тоже позовет метод
__unicode__:{{ lesson }}Еще могу предложить вместо того, чтобы обращаться к отдельным свойствам
title(self.week_day.title,self.ringing_time.title, ...) дать соответствующим объектам свои методы__unicode__, которые будут возвращать их title'ы, и тогда у урока все будет выглядеть попроще:def __unicode__(self): return u"%s, %s, %s, %s, k.%s, %s" % ( self.week_day, self.ringing_time, self.discipline, self.school_class, self.room, self.teacher, )Делаются ли запросы к базе внешних таблиц при приведённом методе unicode?
Это зависит :-). Если вы получили урок просто как
lesson = Lesson.objects.get(...)то да, на каждый ForeignKey будет свой запрос. Чтобы этого не происходило, нужно снабдить вызов получения урока (или уроков) методом
[select_related][]:lesson = Lesson.objects.select_related().get(...) lessons = Lesson.objects.select_related() -
Поле id, как правило, создается автоматически.
Если у вас не сильно старая версия Django, то добавьте в начало файла указание об кодировке:
(Надеюсь, вы файлы в utf-8 сохраняете?)# -*- coding: utf-8 -*-
Замените все не-ASCII строки на юникодные (вообще, конечно, лучше gettext использовать):
Заменитеhelp_text='Активно' -> help_text=u'Активно'
наdef __unicode__(self):
return smart_unicode("..." % (...))
Для решения вашей проблемы, заменитеdef __unicode__(self):
return u"..." % (...)
наself.title = self.__unicode__
Да, запросы делаются.self.title = self.__unicode__() -
Иван, anonymous, спасибо огромное!
Чем дальше разбираюсь с Django - тем больше вопросов возникает: и про propery, и про models.Manager - хотя это темы для отдельных постов.
