Правильное использование 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? Необходимо руководствоваться.
Ответы
Ответ 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
в приведенном выше примере вы не хотите перебирать объекты
он даст вам имя класса в первой строке