Как реализовать простые уведомления в drf?
Обычно в django с шаблонами я реализую базовые уведомления следующим образом.
Например.
class Article(models.Model):
name = models.CharField()
owner = models.ForeignKey(User)
class Comment():
article = models.ForeignKey(Article)
txt = models.CharField()
user = models.ForeginKey()
datetime = models.DateTimeField(auto_now_add=True)
class ArticleNotification():
article = models.ForeignKey(Article)
msg = models.CharField()
is_seen = models.BooleanField(default=False)
datetime = models.DateTimeField(auto_now_add=True)
Если кто-то прокомментировал статью, владелец увидит уведомления.
@transaction.atomic
def post_comment(request, article_id):
comment = Comment.objects.create(article_id=article_id, txt="Nice Article", user=request.user)
ArticleNotification.objects.create(article_id=article_id, msg=f"User {request.user} commented on your post")
Теперь для отображения уведомлений я обычно делаю контекстный процессор:
# context_processor:
def notifcations(request):
notifs = Notfication.objects.filter(article__owner=request.user).order_by("-datetime")
return {"notifs":notifs}
Таким образом, я могу нормально реализовать базовую систему уведомлений с обновлением.
Теперь в (drf + react) какой способ будет предпочтительным для такого типа задач. Должен ли я вместо контекстного процессора сделать get api для списка уведомлений. И вызывать этот api при каждом запросе из react frontend ?
Должен ли я вместо контекстного процессора сделать get api для списка уведомлений
.
Да. Вы можете создать представление DRF API следующим образом
serializers.py
class ArticleNotificationSerializer(ModelSerializer):
class Meta:
model = ArticleNotification
fields = ["id", "article", "msg", "is_seen", "datetime"]
views.py
class ArticleNotificationListView(ListAPIView):
serializer_class = ArticleNotificationSerializer
queryset = ArticleNotification.objects.all()
urls.py
path('notification', ArticleNotificationListView.as_view()),
И вызывать этот api при каждом запросе от react frontend ?
Да. Также вы можете проверять уведомления каждые 10 секунд с помощью setInterval и componentDidMount hook в вашем компоненте react.
componentDidMount: function() { this.countdown = setInterval(function() { axios.get( '/notifications/' ).then(r => this.setState({ notifications: r.data }); // Changing state ) }, 10000); },
Для уведомлений в реальном времени вам нужно что-то вроде каналов Django или вы можете установить get api из react, который запускается через каждое определенное время (скажем, через 5 минут) и собирает необходимые уведомления на основе пользователя.
В вашем случае вещи в контекстном процессоре будут находиться в listapiview, и позже вы сможете получить весь список.