1

モデルを構築する方法に疑問がありました。

私はいくつかのエンティティに投票の可能性を与えたいと思っています。この場合は論文です。私はこの2つの可能性を思いつきました:

オプション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()

クエリを実行するときにすべての投票をロードしたい場合は、django1.4でprefetch_relatedを実行できます。

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

ちなみに、.all()の代わりに.count()を使用できます。これは、値をdjango / pythonに取得する代わりに、値をカウントするだけでよいため、はるかに高速な別のデータベースクエリを生成します。

3番目のアプローチもあります。

モデルに追加のフィールドvotes_countがあり、pre_save()で更新すると、その値が保持されます。このようにして両方を取得できます。すべての投票を照会できますが、数字を取得することもできます。

于 2012-07-15T19:41:16.643 に答える