【问题标题】:what is related_name and related_query_name in django?django 中的related_name 和related_query_name 是什么?
【发布时间】:2020-05-23 22:04:06
【问题描述】:

我对 django 框架中关于 related_name 和 related_query_name 的代码有疑问。请django专家解释一下django中的related_name,代码如下:

related_name='+'

【问题讨论】:

标签: django django-models


【解决方案1】:

相关名称

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/

【讨论】:

  • 这是唯一带有完整示例的解释,非常感谢,在阅读本文之前我完全糊涂了
  • 在相关查询名称部分,您第一次输入School.objects.filter(student__name='abc') 时是否有错字,不应该是students__name,因为您在上面的django 示例中定义了related_name='students'
  • @Rennitbaby 不,应该是student__name,因为我们使用related_query_name 在查询集下进行过滤,例如related_query_nameabc
猜你喜欢
  • 2017-08-25
  • 2011-02-08
  • 2023-01-11
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2014-07-12
相关资源
最近更新 更多