Zee*_*riq 5 django django-models
我对 django 框架中关于 django 中的related_name 和related_query_name的代码有问题。请django高手解释django中的related_name,代码如下:
相关名称='+'
SHI*_*DAL 14
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)
Run Code Online (Sandbox Code Playgroud)
现在,如果您有一个学校对象,那么您可以通过明确地编写查询来访问该学校的所有学生。
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()
Run Code Online (Sandbox Code Playgroud)
这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()
Run Code Online (Sandbox Code Playgroud)
如果您定义,related_name='+'则后向关系在对象上将不可用,并且school.student_set.all()会给您错误。
如果您不希望 Django 创建反向关系,请将 related_name 设置为 '+' 或以 '+' 结尾。例如,这将确保 User 模型不会与此模型具有向后关系:
related_query_name 与 related_name 类似,但它在查询集中使用。
如果您需要通过学校模型对学生应用一些过滤器,那么您会这样做
School.objects.filter(student__name='abc')
Run Code Online (Sandbox Code Playgroud)
但是如果你定义了 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')
Run Code Online (Sandbox Code Playgroud)
请参阅文档以获取进一步参考:https : //docs.djangoproject.com/en/3.0/ref/models/fields/
| 归档时间: |
|
| 查看次数: |
2019 次 |
| 最近记录: |