相关名称
Django 维护每个对象的后向关系,以便于访问相关对象。假设您有两个名为“School”和“Student”的模型,并且一所学校可以有多个学生。所以你会有这样的模型定义
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')
请参阅文档以获取更多参考:https://docs.djangoproject.com/en/3.0/ref/models/fields/