Подтвердить что ты не робот

Правильное использование related_name в Django

У меня есть две модели, которые связаны друг с другом с использованием ForeignKey и related_name. Вот пример.

class Student(models.Model):
    name = models.CharField(max_length=255)
    birthday = models.DateField(blank=True)


class Class(models.Model):

    name = models.CharField(max_length=255)
    student = models.ForeignKey(Student,
                                related_name='classes',
                                null=True)

    def __unicode__(self):
        return self.name

Например, я хотел бы получить доступ к имени класса.

Это то, что я пробовал.

john = Student.objects.get(username = 'john')
print john.classes.name

ничего не печатается.

Но когда я пытаюсь john.classes

я получаю объект django.db.models.fields.related.RelatedManager в 0x109911410. Это показывает, что они связаны между собой. Но я хотел бы получить имя класса.

Я делаю что-то неправильно? Как получить доступ к имени класса с помощью related_name? Необходимо руководствоваться.

4b9b3361

Ответ 1

Да, классы - это менеджер. Это может быть несколько классов для одного учителя. Поэтому для вывода их имен вы должны:

john = Student.objects.get(username = 'john')
for class2 in john.classes.all():
   print class2.name

Если вам нужен только один класс для одного ученика, тогда используйте отношение "один к одному". В этом случае вы можете получить доступ к связанному полю с помощью своего метода.

Ответ 2

Просто знайте: вы определяете отношения 1-много. Таким образом, у ученика может быть несколько классов, поэтому john.classes.name не может работать, так как вы не указали класс, который хотите иметь имя. в john.classes "classes" - это просто менеджер, который вы можете использовать, как и любой другой диспетчер моделей Django. Вы можете сделать john.classes.all() (например, sergzach propsed), но также такие вещи, как john.classes.get(...) или john.classes.filter(...).

Ответ 3

вы можете сделать это, чтобы получить доступ к первой строке в таблице

john = Student.objects.get(username = 'john')    
john.classes.all().first().name # to access first row
john.classes.all().last().name # to access last row

в приведенном выше примере вы не хотите перебирать объекты

он даст вам имя класса в первой строке