Python django restframework如何计算对象和获取自(时间戳)?
伙计们。我试图通过django restframework创建一个通知系统,我的问题是我不知道如何获得未读通知的数量,也不知道如何通过django restframework将时间戳的格式设置为sincetimestamp,因为在正常情况下,我完全知道如何做到这一点 这是我的模型:Python django restframework如何计算对象和获取自(时间戳)?,python,django,django-rest-framework,Python,Django,Django Rest Framework,伙计们。我试图通过django restframework创建一个通知系统,我的问题是我不知道如何获得未读通知的数量,也不知道如何通过django restframework将时间戳的格式设置为sincetimestamp,因为在正常情况下,我完全知道如何做到这一点 这是我的模型: class Notificaciones(models.Model): user_a_notificar = models.ForeignKey(settings.AUTH_USER_MODEL, on
class Notificaciones(models.Model):
user_a_notificar = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
komentario = models.OneToOneField(Post,on_delete=models.CASCADE,
blank=True, related_name="komentario")
estado = models.ManyToManyField('Evento', blank=True)
def __str__(self):
return self.user_a_notificar.username
class Evento(models.Model):
creadores = models.ManyToManyField(settings.AUTH_USER_MODEL,
blank=True, related_name="generadores")
status = models.CharField(default="Unread", max_length=10)
mensaje = models.CharField(max_length=200)
event = models.CharField(max_length=15)
noti_de_evento = models.ForeignKey(Notificaciones,
on_delete=models.CASCADE)
timestampe = models.DateTimeField(auto_now=False, auto_now_add=True)
def __str__(self):
return self.mensaje
我的看法是:
class Notifi(APIView):
serializer = notizerializer
def get(self, request, format=None):
noti = Notificaciones.objects.filter(user_a_notificar=request.user.id)
lista_noti = Evento.objects.filter(noti_de_evento__in=noti)
lista_noticount = Evento.objects.filter(noti_de_evento__in=noti, status="Unread").count()
response = self.serializer(lista_noti, many=True)
return HttpResponse(json.dumps(response.data))
最后是我的序列化程序:
class notizerializer(ModelSerializer):
class Meta:
model = Evento
fields = ('status', 'mensaje', 'event', 'timestampe', 'id')
这是我的两分钱:
这是一个模型,您可以了解如何获取未读事件:
使用相同的序列化程序和视图,但实际上在视图中,您返回的是Evento的序列化程序,而不是Notifications
为了获得sincetimestamp,这是相同的想法,只需创建一个属性来计算它。然后,在这两种情况下,您都可以将模型的属性添加到序列化程序中。以下是更详细的答案:
from django.utils import timesince
class Notificaciones(models.Model):
user_a_notificar = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
komentario = models.OneToOneField(Post, on_delete=models.CASCADE, blank=True, related_name="komentario")
estado = models.ManyToManyField('Evento', blank=True)
def __str__(self):
return self.user_a_notificar.username
class Evento(models.Model):
creadores = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="generadores")
status = models.CharField(default="Unread", max_length=10)
mensaje = models.CharField(max_length=200)
event = models.CharField(max_length=15)
noti_de_evento = models.ForeignKey(Notificaciones, on_delete=models.CASCADE)
timestampe = models.DateTimeField(auto_now=False, auto_now_add=True)
@property
def unread(self):
return sum([n.evento_set.filter(status="Unread").count()
for n in self.notificaciones_set.all()])
@property
def timesince(self):
return timesince.timesince(self.timestampe)
def __str__(self):
return self.mensaje
但在序列化程序中:
from rest_framework import serializers
from .models import Evento
class notizerializer(serializers.ModelSerializer):
unread = serializers.IntegerField()
timesince = serializers.DateTimeField()
class Meta:
model = Evento
fields = ('status', 'mensaje', 'event', 'timestampe', 'id', 'unread', 'timesince')
以下是我伪造数据的结果:
[{"status": "Unread", "mensaje": "jaja", "event": "1", "timestampe": "2018-11-25T01:48:17.374179Z", "id": 1, "unread": 1, "timesince": "16\u00a0hours, 41\u00a0minutes"}]
-使用相同的序列化程序和视图,但实际上在您的视图中,您返回的是Evento的序列化程序,而不是notifications,这正是我想做的,我想通过apirest获取通知框中的事件,但我不知道如何传递计数和时间间隔,具体地说,除了一个值,我不知道如何通过apirest传递任何其他值,在这种情况下,这个值:response=self.serializerlista\u noti,many=True,我用dict尝试了一下,但它不起作用。如果我这样做,我如何在apirest中获得回报?我不完全理解您的模型。在Django中,当您创建foreignkey时,会为您创建隐式名称。例如,在Evento中,您可以访问notificaciones_set.all,这是与该事件相关的所有通知。从Notifications中,您可以访问evento_set,它是与该通知相关的所有事件。这就是说,从Evento开始,你可以设置通知。我将在另一个回复中发布我的新模型和序列化程序!它起作用了!谢谢你,伙计!你是我的英雄!因为我们就在这里,我还有另一个疑问:P,我通过ajax对通知事件进行了更新,将所有未读通知的未读更新为已读,但发送需要相对较长的时间,用未读计数更新通知框和钟形图标,我猜这是因为我将读取更新直接发送到数据库而不是apirest,如果您要求,我会进行更新,向您展示我是如何做到的。我的问题是如何通过apirest做到这一点?你能提出另一个问题吗?评论长了很难读。当你提出问题时,也许可以在这里发表评论,这样我就可以知道哪一个是正确的。
[{"status": "Unread", "mensaje": "jaja", "event": "1", "timestampe": "2018-11-25T01:48:17.374179Z", "id": 1, "unread": 1, "timesince": "16\u00a0hours, 41\u00a0minutes"}]