相关名称
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()
Here 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')
请参阅文档以获取更多参考:https://docs.djangoproject.com/en/3.0/ref/models/fields/