你能解释一下Django中Field对象的related_name
和related_query_name
属性之间的区别吗?当我使用它们时,如何使用它们?谢谢!
答案 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_name
和related_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用于目标模型的反向过滤器名称