gpt4 book ai didi

django - django 中的related_name 和related_query_name 是什么?

转载 作者:行者123 更新时间:2023-12-04 00:01:55 28 4
gpt4 key购买 nike

我对 django 框架中的代码有问题 related_name 和 related_query_name 在 Django 中。请django高手解释django中的related_name,代码如下:

相关名称='+'

最佳答案

相关名称

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() 上的后向关系将不可用会给你错误。

If you’d prefer Django not to create a backwards relation, set related_name to '+' or end it with '+'. For example, this will ensure that the User model won’t have a backwards relation to this model:



相关查询名称

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/

关于django - django 中的related_name 和related_query_name 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60119027/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com