Normalmente en django con plantillas implemento notificaciones básicas como esta.
Por ejemplo.
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)Si alguien comentó el artículo, el propietario verá las notificaciones.
@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")Ahora, para mostrar las notificaciones, normalmente hago un procesador de contexto:
# context_processor: def notifcations(request): notifs = Notfication.objects.filter(article__owner=request.user).order_by("-datetime") return {"notifs":notifs}De esta manera, normalmente puedo implementar un sistema de notificación básico con actualización.
Ahora en (drf + reaccionar) cuál será la forma preferida para este tipo de tarea. En lugar de un procesador de contexto, ¿debería tener que hacer una API de obtención para enumerar las notificaciones y llamar a esta API en cada solicitud de la interfaz de reacción?
En lugar de un procesador de contexto, debería tener que hacer una API de obtención para enumerar las notificaciones
Sí. Puede crear una vista API DRF como esta
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()),¿Y llamar a esta API en cada solicitud de la interfaz de reacción?
Sí. También puede verificar las notificaciones cada 10 segundos con setInterval y elgancho componentDidMount en su componente de reacción.
componentDidMount: function() { this.countdown = setInterval(function() { axios.get( '/notifications/' ).then(r => this.setState({ notifications: r.data }); // Changing state ) }, 10000); },Para la notificación en tiempo real, necesita algo como los canales de Django o puede configurar una API de reacción que se ejecuta después de cada tiempo definido (digamos 5 minutos) y obtendría las notificaciones requeridas según el usuario.
En su caso, las cosas en el procesador de contexto estarían en listapiview y luego puede obtener toda la lista.