Связанное имя
Django поддерживает обратную связь для каждого объекта для быстрого доступа к связанным объектам. Предположим, у вас есть две модели с именами «Школа» и «Студент», и в одной школе может быть несколько учеников. Таким образом, у вас будет определение модели примерно так:
class School(models.Model):
name = models.CharField(max_length=55)
city = models.Charfield(max_length=55)
class Student(models.Model):
name = models.CharField(max_length=55)
school = models.ForeignKey(School)
Теперь, если у вас есть школьные предметы, вы можете получить доступ ко всем учащимся этой школы с явным написанием запроса.
school = School.objects.get(id=1)
# Now if need all students of this school, first thing that come in your mind would be
Student.objects.filter(school=school)
# But instead of this, you can access all students by
school.student_set.all()
Здесь student_set
- это имя по умолчанию, связанное имя, сделанное Django. Но вы можете иметь свои собственные связанные имена, такие как
class Student(models.Model):
name = models.CharField(max_length=55)
school = models.ForeignKey(School, related_name='students')
# Now you can do
school.students.all()
Специальный символ в связанном имени
Если вы определите related_name='+'
, обратное отношение не будет доступно для объекта, и school.student_set.all()
будет выдает ошибку.
Если вы предпочитаете, чтобы Django не создавало обратную связь, установите для related_name значение '+' или завершите его с помощью '+'. Например, это гарантирует, что модель User не будет иметь обратной связи с этой моделью:
Имя связанного запроса
related_query_name похоже на related_name, но используется в запросе .
Если вам нужно применить какой-либо фильтр к ученику через модель школы, тогда вы бы сделали
School.objects.filter(student__name='abc')
Но если вы определите related_query_name, вы можете сделать
class Student(models.Model):
name = models.CharField(max_length=55)
school = models.ForeignKey(School, related_query_name='abc')
# Now you can do
School.objects.filter(abc__name='abc')
См. Do c для дальнейшего использования: https://docs.djangoproject.com/en/3.0/ref/models/fields/