0

既存のDjangoフォーラムアプリ(DjangoBB)を拡張して、ユーザーが特定のフォーラムや特定のスレッドの通知をオプトイン/オプトアウトできるようにします。サイトに既存の通知インフラストラクチャがあり、フォーラム通知をオン/オフにする既存のグローバル設定があります。

私がやりたいのは、各ユーザーが特定のフォーラムまたはスレッドからサブスクライブ/サブスクライブ解除できるようにして、グローバル設定を効果的にオーバーライドすることです。たとえば、グローバル設定が「通知オフ」の場合、特定のフォーラムを「通知オン」に設定しない限り、通知は届きません。この場合、設定しない限り、そのフォーラムのすべての通知が届きます。そのフォーラムの「通知オフ」へのスレッド。スレッドまたはトピックに設定が設定されていない場合、デフォルトでチェーンが上流になります。

私の質問は、Djangoのデータベースでこれらすべてを表すための最良の方法は何ですか?私には2つのアイデアがあります:

class ForumNotificationSetting(models.Model):
    user = models.ForeignKey(User)
    forum = models.ForeignKey(Forum)
    setting = models.NullBooleanField(default=None)

TopicNotificationSettingにも同様のモデルがあります。このように、ユーザーがフォーラム設定を変更するたびに、新しい設定を反映するようにNotificationSettingオブジェクトを作成(または変更)します。この方法は簡単に思えますが、多くの人が多くのフォーラムの設定を作成する場合、新しいフォーラムの投稿が行われるたびに全員に通知を作成するとO(n ^ 2)になるという欠点があります。(おもう...?)

私が考えることができる2番目の方法は、設定を設定したすべてのフォーラムの各ユーザーのプロファイルに多対多フィールドを作成することです。この方法はもっと複雑に思えます(「フォーラムオン」、「フォーラムオフ」、「トピックオン」、「トピックオフ」の合計4つのM2Mフィールドが必要になるため)。パフォーマンス上のメリットがあるかどうか。

この問題をどのように解決しますか?

4

1 に答える 1

3

おそらく、スレッドまたはフォーラムオブジェクトのレベルでM2M関係を作成できます。例:

class Thread(models.Model):
    subscribers = models.ManyToManyField(User)
    other attributes...

次に、ユーザーがスレッドから(アン)サブスクライブするときに、スレッドオブジェクトのサブスクライバープロパティからそれらを追加または削除します。

アプリケーションロジックでは、ユーザーが投稿、スレッド、またはフォーラムを作成するときに、全体的な通知設定を確認し、Trueに設定されている場合は、新しく作成されたスレッド、投稿、またはフォーラムのサブスクライバープロパティにそれらを追加できます。

スレッド、投稿、またはフォーラムが更新されるたびに、すべてのサブスクライバーに通知できます。

エスカレーションを処理するためのロジックが必要だと思います(適切な単語が見つかりません、申し訳ありません)。つまり、スレッドの更新の通知によってフォーラムの更新の通知もトリガーされると思います(または?)。そしてもちろん、1回の投稿更新でユーザーが投稿、スレッド、フォーラムの通知でスパムされないように注意する必要があります...

于 2012-04-10T08:10:37.267 に答える