0

我正在扩展现有的 Django 论坛应用程序 (DjangoBB),以允许用户选择加入/退出特定论坛和/或特定线程的通知。我的网站上已经有一个现有的通知基础设施,以及一个现有的全局设置来打开/关闭论坛通知。

我想要做的是允许每个用户订阅/取消订阅特定论坛或线程,有效地覆盖他们的全局设置。例如,如果我的全局设置为“通知关闭”,那么我将不会收到任何通知,除非我将特定论坛设置为“通知开启”,在这种情况下,我将收到该论坛中所有内容的通知,除非我设置该论坛中的主题为“关闭通知”。如果任何线程或主题没有设置集,则默认为链上。

我的问题是在 Django 的数据库中表示所有这些的最佳方式是什么?我有两个想法:

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

我也会有一个类似的 TopicNotificationSetting 模型。这样,每当用户更改他们的论坛设置时,我都会创建(或修改)一个 NotificationSetting 对象以反映他们的新设置。这种方法看起来很简单,但缺点是如果很多人为很多论坛创建设置,那么每当发布新的论坛帖子时,为每个人创建通知将是 O(n^2)。(我认为...?)

我能想到的第二种方法是在每个用户的个人资料中为他们设置了设置的所有论坛创建一个 ManyToMany 字段。这种方式似乎更复杂(因为我必须有 4 个 M2M 字段,用于“论坛开启”、“论坛关闭”、“主题开启”和“主题关闭”),我不确定是否会有是否有任何性能优势。

你将如何解决这个问题?

4

1 回答 1

3

也许您可以在 Thread 或 Forum 对象级别上创建 M2M 关系,例如:

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

然后,当用户(取消)订阅 Thread 时,您可以从 Thread 对象的订阅者属性中添加或删除它们。

在您的应用程序逻辑中,当用户创建帖子、帖子或论坛时,您可以检查他们的整体通知设置,如果设置为 True,则将它们添加到新创建的帖子、帖子或论坛的订阅者属性中。

每次更新线程、帖子或论坛时,您都可以通知所有订阅者。

我假设您需要一些逻辑来处理升级(我找不到合适的词,抱歉),即我假设线程更新的通知也应该触发论坛更新的通知(或者应该?)。然后,您当然应该注意不要让用户收到针对单个帖子更新的帖子、线程和论坛通知的垃圾邮件……

于 2012-04-10T08:10:37.267 回答