1

我有一个自定义用户数据的配置文件模型:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=False)
    # more stuff...

我还有一个通知应用程序,它允许模型向用户发送通知和电子邮件。

我希望用户可以选择打开或关闭不同的通知,但我不想像这样将大量布尔字段列表添加到配置文件中:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=False)
    send_model1_notice1 = models.BooleanField()
    send_model1_email1 = models.BooleanField()
    send_model1_notice2 = models.BooleanField()
    send_model1_email2 = models.BooleanField()
    send_model2_notice1 = models.BooleanField()
    send_model2_email1 = models.BooleanField()
    send_model3_notice1 = models.BooleanField()
    send_model3_email1 = models.BooleanField()
    # etc...

其中 modelx 是作为通知来源的某个模型或其他应用程序,而 noticex/emailx 是通知的某些特定原因。

我在想一种更可持续的方法是创建一个 ProfileOptions 模型,外部模型可以使用它来定义自己的通知设置。

这样,当我添加一个新的应用程序/模型时,我可以以某种方式将其通知源链接到 ProfileOptions 模型,并让这些选项以神奇的方式打开或关闭它们出现在用户的配置文件中。

这有意义吗?如果是这样,有可能吗?如果是这样,这是个好主意吗?如果是这样,我应该使用什么结构来连接模型、ProfileOptions 和用户的 Profile?

显然我希望对最后一个问题有答案,但我不想排除其他问题的答案可能是“否”的可能性。

4

1 回答 1

0

一种方法是使用一个单独的Notification模型将两者联系起来:

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Notification(models.Model):
    # Foreign key to user profile
    user = models.ForeignKey(Profile)

    # Generic foreign key to whatever model you want.
    src_model_content_type = models.ForeignKey(ContentType)
    src_model_object_id = models.PositiveIntegerField()
    src_model = GenericForeignKey('src_model_content_type', 'src_model_object_id')

    # Notification on or off. Alternatively, only store active notifications.
    active = models.BooleanField()

这种方法可以让您处理任意数量的通知源模型(每个模型都有任意数量的通知),而无需尝试将所有通知信息压缩到您的用户配置文件中。

于 2015-10-05T04:41:51.133 回答