【发布时间】:2017-08-25 06:20:55
【问题描述】:
你能解释一下 Django 中 Field 对象的 related_name 和 related_query_name 属性之间的区别吗?当我使用它们时,如何使用它们?谢谢!
【问题讨论】:
标签: python django django-models
你能解释一下 Django 中 Field 对象的 related_name 和 related_query_name 属性之间的区别吗?当我使用它们时,如何使用它们?谢谢!
【问题讨论】:
标签: python django django-models
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
这里的外键前向关系是专辑到音乐家,后向关系是音乐家到专辑。这意味着一个专辑实例只能与一个音乐家实例有关系(前向关系),而一个音乐家实例可以与多个专辑实例相关(后向关系)。
前向查询会是这样的
Album_instance.artist
注意这里的转发查询由 Album_instance 后跟艺术家(字段名称)完成。和向后将是
Musician_instance.album_set.all()
这里用于向后查询 modelname_set 。
现在,如果您指定相关名称,例如
artist = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name='back')
然后向后查询语法将更改 modelname_set(artist.set) 将替换为 back。 现在向后查询
Musician_instance.back.all()
如果您不希望 Django 创建反向关系,请将 related_name 设置为 '+' 或以 '+' 结尾。
和related_query_name 用于目标模型的反向过滤器名称
【讨论】:
related_name 将是相关对象的属性,允许您“向后”转到带有外键的模型。例如,如果ModelA 具有类似model_b = ForeignKeyField(ModelB, related_name='model_as') 的字段,这将使您能够通过转到model_b_instance.model_as.all() 访问与您的ModelB 实例相关的ModelA 实例。请注意,这通常用复数来表示外键,因为外键是一对多关系,而该等式的多边是声明了外键字段的模型。
文档中链接的进一步解释很有帮助。 https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects
related_query_name 用于 Django 查询集。它允许您过滤外键相关字段的反向关系。继续我们的示例 - 在Model A 上有一个字段,例如:
model_b = ForeignKeyField(ModelB, related_query_name='model_a') 将使您能够使用 model_a 作为查询集中的查找参数,例如:ModelB.objects.filter(model_a=whatever)。 related_query_name 使用单数形式更为常见。正如文档所说,没有必要同时指定related_name 和related_query_name。 Django 有合理的默认值。
【讨论】:
related_query_name defaults to the value of related_name or default_related_name if set, otherwise it defaults to the name of the model
related_name 和related_query_name 之间没有太大区别,因为我可以在ModelB.objects.filter(model_a=whatever) 这样的查询中使用related_name。直到现在我还不知道related_query_name,而且大多数必需的案例仍然被覆盖。
related_query_name 默认为 related_name 的值。