Django一对多
Django one-to many
我真的很困惑 Django 如何处理数据库关系。
最初我有一个包含 article_views 的简单 IntegerField 的文章模型,最近我试图扩展 article_view 的定义以包含它自己的字段,所以我创建了一个模型它。 (IP、会话密钥等。)
我对如何建立这种关系有点不知所措,对我来说,在文章模型中有一个一对多的字段是最有意义的,因为一篇文章可以有很多不同的观点, 但一个视图只能是一篇文章的一部分。
我看到的所有实现都以一种非常奇怪的反向方式设置了这个,这是怎么回事?
不幸的是,Django 没有一对多字段。这是通过在本例中的 ArticleView
模型上创建 ForeignKey
来实现的。当您想轻松访问模板中的文章视图时,您可以在 ForeignKey
上设置 related_name
。
class Article(models.Model):
# Article definition
class ArticleView(models.Model):
article = models.ForeignKey(Article, related_name='views')
在模板中,您现在可以使用 article.views.count()
来获取与帐户关联的观看次数。
请注意,这会为您想要的每个计数创建一个数据库查询。有一个带注释的查询集可能会更好:Article.objects.annotate(num_views=Count('views'))
我真的很困惑 Django 如何处理数据库关系。
最初我有一个包含 article_views 的简单 IntegerField 的文章模型,最近我试图扩展 article_view 的定义以包含它自己的字段,所以我创建了一个模型它。 (IP、会话密钥等。)
我对如何建立这种关系有点不知所措,对我来说,在文章模型中有一个一对多的字段是最有意义的,因为一篇文章可以有很多不同的观点, 但一个视图只能是一篇文章的一部分。
我看到的所有实现都以一种非常奇怪的反向方式设置了这个,这是怎么回事?
不幸的是,Django 没有一对多字段。这是通过在本例中的 ArticleView
模型上创建 ForeignKey
来实现的。当您想轻松访问模板中的文章视图时,您可以在 ForeignKey
上设置 related_name
。
class Article(models.Model):
# Article definition
class ArticleView(models.Model):
article = models.ForeignKey(Article, related_name='views')
在模板中,您现在可以使用 article.views.count()
来获取与帐户关联的观看次数。
请注意,这会为您想要的每个计数创建一个数据库查询。有一个带注释的查询集可能会更好:Article.objects.annotate(num_views=Count('views'))