Как настроить пользовательские параметры 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()
Этот подход позволит вам обрабатывать произвольное количество исходных моделей для уведомлений (каждая с произвольным количеством уведомлений), не пытаясь втиснуть всю информацию об уведомлениях в свой профиль пользователя.