Как реализовать простые уведомления в 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, и позже вы сможете получить весь список.

Вернуться на верх