Как настроить пользовательские параметры django для общих моделей

У меня есть модель профиля для пользовательских данных пользователя:

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 - это какая-то модель или какое-то другое приложение, которое является источником уведомления, а visiblex/emailx - это определенная причина для уведомления.

Я думал, что более устойчивый способ сделать это - создать модель ProfileOptions, которую внешние модели могли бы использовать для определения своих собственных настроек уведомлений.

Таким образом, когда я добавляю новое приложение / модель, я мог бы как-то связать его источники уведомлений с моделью ProfileOptions, и эти опции для их включения или выключения волшебным образом появляются в профиле пользователя.

Имеет ли это смысл? Если это так, возможно ли это? Если так, то это хорошая идея? и если да, то какую структуру я должен использовать для соединения моделей, ProfileOptions и профиля пользователя?

Очевидно, я надеюсь на ответ на последний вопрос, но я не хочу исключать возможность того, что ответ на другие может быть "нет".

1 ответ

Одним из подходов было бы иметь отдельный 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()

Этот подход позволит вам обрабатывать произвольное количество исходных моделей для уведомлений (каждая с произвольным количеством уведомлений), не пытаясь втиснуть всю информацию об уведомлениях в свой профиль пользователя.

Другие вопросы по тегам