查询速度反向OneToOneField

时间:2015-12-05 15:05:57

标签: django postgresql django-queryset

我对两种文章分配给杂志的方式存在疑问。模型的一些伪代码可能是:

class Article():
  title = ...
  text = ...
  magazine = ForeignKey(Magazine, db_index=True)


class Magazine():
   ...

class ArticleMagazineAllocation():
  article = OneToOneField(Article, db_index=True)
  magazine = ForeignKey(Magazine, db_index=True)
  allocated_on = DateTimeField()

我可以通过文章创建一个ForeignKey to Magazine。或者,我可以使用ArticleMagazineAllocation模型来连接两者,我希望由于多种原因,存储关于"分配"的额外数据。

对于第一种情况,查询将是: magazine_articles = Article.objects.filter(magazine = mymagazine)

对于第二个,查询将是: magazine_aticles = Article.objects.filter(articlemagazineallocation__magazine = mymagazine)

使用LOT(数百万)篇文章和一些(数百种)杂志,使用第二种方法会有相当大的速度损失吗?

1 个答案:

答案 0 :(得分:0)

如果您需要建模需要关系本身的其他数据的多对多关系,您应该创建一个中间模型。要直接查询相关模型,您可以使用选项ManyToMany在任一模型上放置through字段。要查询相关模型,您始终可以在Django中使用双下划线查询语法。

https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ManyToManyField.through

就性能而言,您可以使用select_relatedprefetch_related来查询跨越多个表格的大型数据集。