Django中'related_name'和'related_query_name'属性的区别?

时间:2017-03-31 05:10:05

标签: python django django-models

你能解释一下Django中Field对象的related_namerelated_query_name属性之间的区别吗?当我使用它们时,如何使用它们?谢谢!

2 个答案:

答案 0 :(得分:32)

related_name将是相关对象的属性,允许您使用外键向后“返回”模型。例如,如果ModelA的字段类似于:model_b = ForeignKeyField(ModelB, related_name='model_as'),则可以通过ModelA访问与ModelB实例相关的model_b_instance.model_as.all()个实例}。请注意,对于外键,这通常用复数形式写,因为外键是一对多关系,并且该等式的许多方面是在其上声明了外键字段的模型。

与文档相关的进一步解释很有帮助。 https://docs.djangoproject.com/en/1.10/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_namerelated_query_name两者(或其中之一)。 Django有合理的默认值。

答案 1 :(得分:0)

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_instanc完成,后跟artist(字段名称)。而向后将是

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用于目标模型的反向过滤器名称