在关于related_name
的Django文档中,它说明了以下内容:
用于从相关对象返回到此关系的关系的名称。它也是
related_query_name
的默认值(用于目标模型的反向过滤器名称的名称)。有关完整说明和示例,请参阅相关对象文档。请注意,在抽象模型上定义关系时必须设置此值;当你这样做时,可以使用一些特殊的语法。如果您不希望Django不创建向后关系,请将related_name设置为' +'或以' +'结束。
我没有清楚地理解它。如果有人愿意解释一下,它会对我有很大帮助。
答案 0 :(得分:7)
创建外键时,将两个模型链接在一起。具有ForeignKey()
字段的模型使用字段名称来查找其他模型。它还隐式地将一个成员添加到链接模型中,并引用该成员。
class Post(models.Model):
# ... fields ...
class Comment(models.Model):
# ... fields ...
post = models.ForeignKey(Post, related_name=???)
这里有三种可能的情况:
related_name
如果您没有指定名称,django将默认为您创建一个名称。
some_post = Post.objects.get(id=12345)
comments = some_post.comment_set.all()
默认名称是关系&#name {+ 1}}。
通常你想要指定一些东西来使它更自然。例如,_set
。
related_name="comments"
有时您不想添加对外部模型的引用,因此请使用some_post = Post.objects.get(id=12345)
comments = some_post.comments.all()
不创建它。
related_name="+"
some_post = Post.objects.get(id=12345)
comments = some_post.comment_set.all() # <-- error, no way to access directly
基本上是相同的想法,但在查询集上使用related_query_name
时:
filter()
但说实话,我从未使用过这个,因为默认使用posts_by_user = Post.objects.filter(comments__user__id=123)
值。
答案 1 :(得分:2)
如果在模型中您有ForeignKey
字段(这意味着您将此字段指向其他模型):
class Author(models.Model):
name = ......
email = .....
class Article(models.Model):
author = models.ForeignKey(User)
title= ....
body = ....
如果您在此字段中指定related_name
class Author(modles.Model):
author = models.ForeignKey(Author, related_name='articles')
您可以将属性的名称用于关联对象(名为反向关系),从相关对象返回到此属性(从Author
到Article
)。定义之后,您可以检索用户的文章,如下所示:
author.articles.all()
如果您没有定义related_name
属性,Django将使用模型的小写名称,后跟_set
(在我们的例子中,article_set
)将相关对象的关系命名为此关系,因此您必须检索用户的所有文章,如下所示:
author.article_set.all()
如果您不希望出现反向关系(从您的ForeignKey
提交到此模型的模型(定义{{1}}字段的模型)你可以设置
ForeignKey