Я пытаюсь создать простую модель уведомления/сообщения для своего приложения Django. Это будет хранить уведомления с сайта пользователю и сообщения от одного пользователя к другому. Рабочая модель, которую я использовал, выглядит так:Django: простая модель для хранения сообщений и уведомлений от пользователей
class Notification(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='sender_notification')
recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='recipient_notification')
message = models.TextField()
read = models.BooleanField(default=False)
recieved_date = models.DateTimeField(auto_now_add=True)
сообщение будет 0-1 отправителей (0, если сообщение является уведомлением от сайта к пользователю), и, как правило, один получателем (если уведомление предназначен для одного конкретного пользователя - например, «есть комментарий к вашей записи» - или когда сообщение было отправлено от одного пользователя к другому). Это работало для меня. Однако мне пришло в голову, что в некоторых случаях я хочу отправить уведомление каждому пользователю. Я мог бы потенциально создать Notification
объектов в цикле:
for user in User.objects.all():
Notification.objects.create(recipient=user, message='message for all uses')
Но это, кажется, что это будет довольно неэффективно, и создавать ненужные в базе данных.
Я экспериментировал с обновлением моей модели, как это:
class Notification(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='sender_notification')
recipient = models.ManyToManyField(User)
message = models.TextField()
read = models.BooleanField(default=False)
recieved_date = models.DateTimeField(auto_now_add=True)
Но это требует sender
(по причинам, которые я не понимаю), и так как есть только одна запись для каждого уведомления, когда один получатель читает уведомление, и я установил read = True
, он будет отображаться как прочитанный для всех получателей.
Есть ли простое решение, которое мне не хватает, когда я могу использовать одну модель для обработки уведомлений/сообщений, или мне придется добавить некоторые дополнительные модели (или дублировать уведомления в таблице уведомлений)?
Простите мое незнание дизайна базы данных. Это определенно слабость, над которой я работаю.
Я рассматривал это, но есть ли преимущество в добавлении одной записи «Message», а затем добавление записей «ReadFlag» для каждого пользователя по сравнению с одной таблицей и добавлением записи «Message» для каждого пользователя? – elethan
Вы не должны клонировать содержимое сообщения. Одно сообщение -> Многие пользователи – Admdebian