Python 有没有办法在Django中序列化多个对象?

Python 有没有办法在Django中序列化多个对象?,python,json,django,Python,Json,Django,在Django项目中,我想实现一个简单的聊天框 版本 Django版本3.0.8 型号.py class DirectMessageClass(models.Model): sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='from_this') receiver = models.ForeignKey(User, on_delete=mo

在Django项目中,我想实现一个简单的聊天框

版本

Django版本3.0.8

型号.py

class DirectMessageClass(models.Model):  
sender = models.ForeignKey(User, on_delete=models.CASCADE,
                             related_name='from_this')
receiver = models.ForeignKey(User, on_delete=models.CASCADE,
                              related_name='to_this')
timestamp = models.DateTimeField(auto_now=True)
content = models.CharField(max_length=200)
read = models.BooleanField(default=False)

def serialize(self):
    return {
        "id": self.id,
        "sender": self.sender.username,
        "sendername":self.sender.profile.firstname,
        "senderimage":self.sender.profile.image.url,
        "receiver": self.receiver.username,
        "content": self.content,
        "timestamp":self.timestamp.strftime("%m/%d/%Y, %H:%M:%S"), # to format date
        "read":self.read,
    }
def loadbox(request):
user = request.user 
# Return messages in reverse chronologial order
messages = DirectMessageClass.objects.filter(receiver=user).order_by("-timestamp").all()
return JsonResponse([message.serialize() for message in messages], safe=False)
def loadbox(request):
user = request.user 
# Return messages in reverse chronologial order
messages = DirectMessageClass.objects.filter(receiver=user).order_by("-timestamp").all()
# return replies sent by the current user
replies = DirectMessageClass.objects.filter(sender=user).order_by("-timestamp").all()
return JsonResponse([message.serialize() for message in messages], safe=False)
视图.py

class DirectMessageClass(models.Model):  
sender = models.ForeignKey(User, on_delete=models.CASCADE,
                             related_name='from_this')
receiver = models.ForeignKey(User, on_delete=models.CASCADE,
                              related_name='to_this')
timestamp = models.DateTimeField(auto_now=True)
content = models.CharField(max_length=200)
read = models.BooleanField(default=False)

def serialize(self):
    return {
        "id": self.id,
        "sender": self.sender.username,
        "sendername":self.sender.profile.firstname,
        "senderimage":self.sender.profile.image.url,
        "receiver": self.receiver.username,
        "content": self.content,
        "timestamp":self.timestamp.strftime("%m/%d/%Y, %H:%M:%S"), # to format date
        "read":self.read,
    }
def loadbox(request):
user = request.user 
# Return messages in reverse chronologial order
messages = DirectMessageClass.objects.filter(receiver=user).order_by("-timestamp").all()
return JsonResponse([message.serialize() for message in messages], safe=False)
def loadbox(request):
user = request.user 
# Return messages in reverse chronologial order
messages = DirectMessageClass.objects.filter(receiver=user).order_by("-timestamp").all()
# return replies sent by the current user
replies = DirectMessageClass.objects.filter(sender=user).order_by("-timestamp").all()
return JsonResponse([message.serialize() for message in messages], safe=False)
我使用此方法成功地获取消息并将其转换为/loadbox路径中的JSON对象。稍后,我获取这些数据以显示消息,它就可以工作了

我的/loadbox路径示例

[{"id": 1, "sender": "ekvatorcizgisi", "sendername": "Asli", 
  "receiver": "bilge", "content": "hi", "timestamp": "09/02/2020, 08:22:26", "read": true}]

   
但是,因为我希望它显示为对话框。我还需要在这个JSON对象中添加回复消息

在views.py中我尝试

class DirectMessageClass(models.Model):  
sender = models.ForeignKey(User, on_delete=models.CASCADE,
                             related_name='from_this')
receiver = models.ForeignKey(User, on_delete=models.CASCADE,
                              related_name='to_this')
timestamp = models.DateTimeField(auto_now=True)
content = models.CharField(max_length=200)
read = models.BooleanField(default=False)

def serialize(self):
    return {
        "id": self.id,
        "sender": self.sender.username,
        "sendername":self.sender.profile.firstname,
        "senderimage":self.sender.profile.image.url,
        "receiver": self.receiver.username,
        "content": self.content,
        "timestamp":self.timestamp.strftime("%m/%d/%Y, %H:%M:%S"), # to format date
        "read":self.read,
    }
def loadbox(request):
user = request.user 
# Return messages in reverse chronologial order
messages = DirectMessageClass.objects.filter(receiver=user).order_by("-timestamp").all()
return JsonResponse([message.serialize() for message in messages], safe=False)
def loadbox(request):
user = request.user 
# Return messages in reverse chronologial order
messages = DirectMessageClass.objects.filter(receiver=user).order_by("-timestamp").all()
# return replies sent by the current user
replies = DirectMessageClass.objects.filter(sender=user).order_by("-timestamp").all()
return JsonResponse([message.serialize() for message in messages], safe=False)
我不知道如何在/loadbox路径中返回多个Json响应

return JsonResponse([message.serialize() for message in messages,reply.serialize() for reply in replies], safe=False)
显然给出了语法错误,(SyntaxError:invalid syntax)我也尝试了将其全部放在列表中,但无法使其工作

我的理想输出是

也许我会用另一种方式回复邮件来解决这个问题,但我想知道有没有更好的方法来解决这个问题?

使用列表打包技术

def loadbox(request):
    # rest of your code
    return JsonResponse(
        [
            *[message.serialize() for message in messages],
            *[reply.serialize() for reply in replies]
        ],
        safe=False
    )
“给出语法错误”对我来说似乎很好,您得到了什么错误?\return JsonResponse([message.serialize()用于消息中的消息,reply.serialize()用于答复中的答复),safe=False)^SyntaxError:无效语法