1. hardtop

    13.11.2008 21:26

    Добрый день!

    Задача. Класс "Уроки" имеет ссылки на Учителей, Предметы, Классы и пр. Т.е. весь состоит из 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)
  2. Иван Сагалаев

    13.11.2008 23:37

    Как просто получить строку "Среда, 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()
    
  3. anonymous

    14.11.2008 00:19

    Поле id, как правило, создается автоматически.
    Если у вас не сильно старая версия Django, то добавьте в начало файла указание об кодировке:
    # -*- coding: utf-8 -*-
    (Надеюсь, вы файлы в 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__()
    Да, запросы делаются.
  4. hardtop

    14.11.2008 16:16

    Иван, anonymous, спасибо огромное!

    Чем дальше разбираюсь с Django - тем больше вопросов возникает: и про propery, и про models.Manager - хотя это темы для отдельных постов.

bbcode