что такое related_name и related_query_name в django? - PullRequest
1 голос
/ 07 февраля 2020

У меня проблема с кодом в django framework, относящимся к related_name и related_query_name в django. django эксперт объяснит имя_связи в django, код приведен ниже:

имя_подключения = '+'

1 Ответ

1 голос
/ 07 февраля 2020

Связанное имя

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...