【问题标题】:What does related_name do?related_name 有什么作用?
【发布时间】:2017-10-24 22:50:21
【问题描述】:

在关于 related_name 的 Django 文档中,它说如下:

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

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

我没看清楚。如果有人愿意多解释一下,那将对我有很大帮助。

【问题讨论】:

  • 这似乎有点宽泛。这到底是怎么回事 - 以及链接的文档 - 你不明白吗?
  • 为什么使用它,在哪里使用它以及'+'号是什么?
  • 但这些是您引用的段落中明确解释的内容。
  • 其实我是 django 新手,很难理解(可能是因为我很笨)。所以,我想如果我在这里问一些专业知识会稍微打破这个段落,并更多地解释“从相关对象回到这个对象的关系”和“+”号。
  • 这是您需要从相关对象调用的名称,以便获取它的父相关模型对象

标签: django


【解决方案1】:
  1. 如果在一个模型中你有一个ForeignKey 字段(这意味着你通过这个字段指向其他模型):

    class Author(models.Model):
        name = ......
        email = .....
    
    class Article(models.Model):
        author = models.ForeignKey(Author)
        title= ....
        body = ....
    

    如果您在此字段中指定related_name

    class Article(modles.Model):
        author = models.ForeignKey(Author, related_name='articles')
    

    您为属性命名,您可以将其用于从相关对象到此对象的关系(命名为reverse relationship)(从AuthorArticle)。定义后,您可以像这样检索用户的文章:

    author.articles.all()
    
  2. 如果你没有定义related_name 属性,Django 将使用模型的小写名称后跟_set(在我们的例子中是article_set)来命名从相关对象回来的关系到这个,所以你必须像这样检索用户的所有文章:

    author.article_set.all()
    
  3. 如果您不希望出现反向关系(从您的ForeignKey 归档的模型指向此模型(定义ForeignKey 字段的模型),您可以设置

    class Author(models.Model):
        author = models.ForeignKey(User, related_name='+')
    

【讨论】:

    【解决方案2】:

    当您创建外键时,您将两个模型链接在一起。具有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()
    

    默认名称是关系名称 + _set

    2。指定自定义值

    通常你想指定一些东西让它更自然。例如,related_name="comments"

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

    3。防止创建反向引用

    有时你不想添加对外国模型的引用,所以使用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)
    

    但老实说,我从未使用过这个,因为默认使用 related_name 值。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2020-05-23
      • 2023-01-11
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2023-04-10
      • 2011-07-17
      • 2014-09-13
      相关资源
      最近更新 更多