1

我对如何构建模型有疑问。

我想给一些实体投票的可能性,在这种情况下,是一篇论文。我想出了这两种可能性:

选项1:

Link the entity as a relationship

class Vote(model.Model):
    author = models.ForeignKey(User)

    created = models.DateField(auto_now=True)
    value = models.IntegerField(default=1)


class Paper(models.Model):
    author = models.ForeignKey(User)
    edition = models.ForeignKey(ConferenceEdition)

    votes = models.OneToMany(Vote)

好处:

  • 使用模型(ORM)更容易
  • 我可以和其他人一起使用这个投票实体
  • 在呈现 HTML 时,我可能需要这些信息,以显示用户已经投票了哪些论文。

缺点:

  • 恐怕数据库越大,越慢。

选项 2:

不链接班级

class Vote(model.Model):
    author = models.ForeignKey(User)

    created = models.DateField(auto_now=True)
    value = models.IntegerField(default=1)

    entity_id = models.IntegerField()
    entity_type = models.CharField(max_length=255,default='Paper')


class Paper(models.Model):
    author = models.ForeignKey(User)
    edition = models.ForeignKey(ConferenceEdition)

    num_votes = models.IntegerField(default=0)

优点:

  • 这是一种延迟加载,我有一个柜台,如果我需要信息,我可以去找它。
  • 它更快(我认为)

缺点:

  • 您必须依靠新逻辑来更新所有新投票。

选项 3:

我在听

谢谢!

4

1 回答 1

4

仅当您显式调用它们时,Django 才会加载多对多字段。

所以在你的第一种情况下:

paper.votes.all()

如果您想在查询时加载所有投票,您可以在 django 1.4 中执行prefetch_related

paper = Paper.objects.get(pk=1).prefetch_related('votes')

顺便说一句,你可以使用 .count() 代替 .all(),它会生成一个更快的不同数据库查询,因为它只需要对值进行计数,而不是将它们检索到 django/python 中。

还有第三种方法:

你可以在你的模型中有额外的字段: votes_count,你可以在 pre_save() 上更新,它会为你保存这个值。这样你就可以得到两者:你可以查询所有选票,但你也可以只获取一个数字。

于 2012-07-15T19:41:16.643 回答