在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
既不是Reporter
或django.db.models.Model
In [3]: hasattr('article_set', 'models.Model')
Out[3]: False
它是如何工作的?或者提供一个提示,以便我可以进一步探索。
答案 0 :(得分:0)
“相关经理”是在一对多或多对多中使用的经理 相关背景。
它会自动添加为每个相关字段名称的一部分,因此在您的情况下,文章在Reporter上有ForeignKey,这使得Reporter能够获取与获取Reporter对象的文章相同的article_set(例如:article.reporter
)。
另外有关如何执行custom reverse manager
的有趣信息也不要害怕深入研究Django源代码,以便更好地了解它是如何工作的