【问题标题】:Difference between 'related_name' and 'related_query_name' attributes in Django?Django中'related_name'和'related_query_name'属性之间的区别?
【发布时间】:2017-08-25 06:20:55
【问题描述】:

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

【问题讨论】:

    标签: python django django-models


    【解决方案1】:
    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_instance 后跟艺术家(字段名称)完成。和向后将是

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

    【讨论】:

      【解决方案2】:

      related_name 将是相关对象的属性,允许您“向后”转到带有外键的模型。例如,如果ModelA 具有类似model_b = ForeignKeyField(ModelB, related_name='model_as') 的字段,这将使您能够通过转到model_b_instance.model_as.all() 访问与您的ModelB 实例相关的ModelA 实例。请注意,这通常用复数来表示外键,因为外键是一对多关系,而该等式的多边是声明了外键字段的模型。

      文档中链接的进一步解释很有帮助。 https://docs.djangoproject.com/en/dev/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 有合理的默认值。

      【讨论】:

      • 不用担心。如果这解决了您的问题,您介意接受答案吗?
      • related_query_name defaults to the value of related_name or default_related_name if set, otherwise it defaults to the name of the model
      • 完美的解释。竖起大拇指(y)
      • 看来related_namerelated_query_name 之间没有太大区别,因为我可以在ModelB.objects.filter(model_a=whatever) 这样的查询中使用related_name。直到现在我还不知道related_query_name,而且大多数必需的案例仍然被覆盖。
      • @JayVasant 有一个区别,并且定义明确。您所看到的是@Windsooon 在评论中解释的行为:related_query_name 默认为 related_name 的值。
      猜你喜欢
      • 2020-05-23
      • 2011-05-31
      • 1970-01-01
      • 2012-10-03
      • 2011-06-22
      • 2012-08-27
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多