【发布时间】:2021-07-08 13:19:53
【问题描述】:
假设我们有两个模型(多对一模型)。 下面的代码显示一个记者可以有多篇文章
class Reporter(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
email = models.EmailField()
def __str__(self):
return "%s %s" % (self.first_name, self.last_name)
class Article(models.Model):
headline = models.CharField(max_length=100)
pub_date = models.DateField(null=True)
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.headline
让我们看看我的数据库中关于这个模型的内容。
# Reporter.objects.all().values()
# <QuerySet [
# {'id': 1, 'first_name': 'John', 'last_name': 'Smith', 'email': 'john@example.com'},
# {'id': 2, 'first_name': 'Paul', 'last_name': 'Jones', 'email': 'paul@example.com'}
# ]>
# Article.objects.all().values()
# <QuerySet [
# {'id': 5, 'headline': "1st headline", 'pub_date': datetime.date(2005, 7, 29),
# 'reporter_id': 1},
# {'id': 6, 'headline': "2nd headline", 'pub_date': datetime.date(2006, 1, 17),
# 'reporter_id': 2},
# {'id': 7, 'headline': '3rd headline', 'pub_date': datetime.date(2005, 7, 27),
# 'reporter_id': 1}
# ]>
第一个记者有两个出版物,第二个只有一个。 我需要为每个记者获取所有文章的列表。 我试过这种方式(根据 django 文档):
Article.objects.filter(reporter__first_name='John')
没关系。有用。我还尝试将第一个记者实例化为“r1”,然后执行以下操作:
r1.article_set.all()
这段代码也有效。 但由于我是 django 新手,我认为将第一个记者实例化为 'r1' 然后进行查询有点慢。这是因为 django 让我运行 r1.save(),然后运行 r1.article_set.all()。看起来 django 对数据库进行了 2 个查询(第一个查询 - 保存实例,第二个查询运行 r1.article_set.all)
我的观点正确吗?以及如何像 Article.objects.filter(reporter__first_name='John') 但使用 Reporter 对象查询所有记者的文章? 谢谢
【问题讨论】:
标签: django django-models django-orm many-to-one