r.article_set.all()不通过.objects进行查询,而返回查询

时间:2017-11-12 04:22:14

标签: django

在Django的教程中,Django at a glance | Django documentation | Django

r.article_set.all()不通过.objects进行查询,而是返回查询。

这是一个简单的例子:

#mysite/news/models.py

from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):              # __unicode__ on Python 2
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

在Django shell中工作,

# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')
# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

返回QuerySet,即使未调用Managers

我搜索文档并了解A Manager是向Django模型提供数据库查询操作的接口。对于Django应用程序中的每个模型,至少存在一个Manager。

所以我能理解:

>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

Django为每个Django模型类添加了一个名为objects的Manager。 Managers | Django documentation | Django

对于r.article_set.all(),它不会通过.objects进行查询,而是返回查询。

article_set既不是Reporterdjango.db.models.Model

的属性
In [3]: hasattr('article_set', 'models.Model')
Out[3]: False

它是如何工作的?或者提供一个提示,以便我可以进一步探索。

1 个答案:

答案 0 :(得分:0)

通过RelatedManager

  

“相关经理”是在一对多或多对多中使用的经理   相关背景。

它会自动添加为每个相关字段名称的一部分,因此在您的情况下,文章在Reporter上有ForeignKey,这使得Reporter能够获取与获取Reporter对象的文章相同的article_set(例如:article.reporter)。

另外有关如何执行custom reverse manager

的有趣信息

也不要害怕深入研究Django源代码,以便更好地了解它是如何工作的