related_name有什么作用?

时间:2017-05-24 14:14:14

标签: django

在关于related_name的Django文档中,它说明了以下内容:

  

用于从相关对象返回到此关系的关系的名称。它也是related_query_name的默认值(用于目标模型的反向过滤器名称的名称)。有关完整说明和示例,请参阅相关对象文档。请注意,在抽象模型上定义关系时必须设置此值;当你这样做时,可以使用一些特殊的语法。

     

如果您不希望Django不创建向后关系,请将related_name设置为' +'或以' +'结束。

我没有清楚地理解它。如果有人愿意解释一下,它会对我有很大帮助。

2 个答案:

答案 0 :(得分:7)

创建外键时,将两个模型链接在一起。具有ForeignKey()字段的模型使用字段名称来查找其他模型。它还隐式地将一个成员添加到链接模型中,并引用该成员。

class Post(models.Model):
    # ... fields ...

class Comment(models.Model):
    # ... fields ...
    post = models.ForeignKey(Post, related_name=???)

这里有三种可能的情况:

1。不要指定related_name

如果您没有指定名称,django将默认为您创建一个名称。

some_post = Post.objects.get(id=12345)
comments = some_post.comment_set.all()

默认名称是关系&#name {+ 1}}。

2。指定自定义值

通常你想要指定一些东西来使它更自然。例如,_set

related_name="comments"

3。防止创建反向引用

有时您不想添加对外部模型的引用,因此请使用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)

  1. 如果在模型中您有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')
    

    您可以将属性的名称用于关联对象(名为反向关系),从相关对象返回到此属性(从AuthorArticle )。定义之后,您可以检索用户的文章,如下所示:

    author.articles.all()
    
  2. 如果您没有定义related_name属性,Django将使用模型的小写名称,后跟_set(在我们的例子中,article_set)将相关对象的关系命名为此关系,因此您必须检索用户的所有文章,如下所示:

    author.article_set.all()
    
  3. 如果您不希望出现反向关系(从您的ForeignKey提交到此模型的模型(定义{{​​1}}字段的模型)你可以设置

    ForeignKey