Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django restframework如何计算对象和获取自(时间戳)?_Python_Django_Django Rest Framework - Fatal编程技术网

Python django restframework如何计算对象和获取自(时间戳)?

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

伙计们。我试图通过django restframework创建一个通知系统,我的问题是我不知道如何获得未读通知的数量,也不知道如何通过django restframework将时间戳的格式设置为sincetimestamp,因为在正常情况下,我完全知道如何做到这一点

这是我的模型:

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"}]