django - 过滤查询以获取两个 friend 之间的聊天消息?

标签 django django-models django-rest-framework django-views

我正在尝试创建一个聊天 API,我已将消息模型构造为如下所示


class ChatMessage(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="user")
    sender = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="sender")
    reciever = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="reciever")
    message = models.CharField(max_length=10000000000)
    is_read = models.BooleanField(default=False)
    date = models.DateTimeField(auto_now_add=True)

现在我正在尝试编写 API View 来获取仅属于和我正在聊天的的所有消息。

让我详细说明一下:假设Destiny正在给Sammy发短信,那么我(Destiny)和用户(Sammy)之间肯定会发送很多消息,所以我想获取所有这些文本。

这是我为此编写的 View

class GetMessages(generics.ListAPIView):
    serializer_class = MessageSerializer
    
    def get_queryset(self):
        sender_id = self.kwargs['sender_id']
        reciever_id = self.kwargs['reciever_id']
        messages =  ChatMessage.objects.filter(sender=sender_id, reciever=reciever_id)
        return messages

网址

    path("api/get-messages/<sender_id>/<reciever_id>/", views.GetMessages.as_view()),

这就是该 View 返回的内容

## url - http://127.0.0.1:8000/api/get-messages/2/1/
[
    {
        "id": 2,
        "sender": 2,
        "reciever": 1,
        "message": "Hey Destiny",
        "is_read": false
    }
]

如果我交换 sender_id 和 receive_id,这就是我得到的响应

# url - http://127.0.0.1:8000/api/get-messages/1/2/
[
    {
        "id": 1,
        "sender": 1,
        "reciever": 2,
        "message": "Hello Sammy",
        "is_read": false
    },
    {
        "id": 3,
        "sender": 1,
        "reciever": 2,
        "message": "This is another message for you sammy",
        "is_read": false
    }
]

我想要的是这样的,当我在url中传入发送者的id(1)和接收者的id(2)时,我想得到这样的响应,这就是这两个人的所有对话人们已经经历过了。

[
    {
        "id": 1,
        "sender": 1,
        "reciever": 2,
        "message": "Hello Sammy",
        "is_read": false
    },
    {
        "id": 2,
        "sender": 2,
        "reciever": 1,
        "message": "Hey Destiny",
        "is_read": false
    },
    {
        "id": 3,
        "sender": 1,
        "reciever": 2,
        "message": "This is another message for you sammy",
        "is_read": false
    }
]

一些图片 enter image description here enter image description here enter image description here

最佳答案

您可以使用 Q object这里:

from django.db.models import Q

然后

messages = ChatMessage.objects.filter(
    Q(sender=sender_id, reciever=reciever_id) | 
    Q(sender=reciever_id, reciever=sender_id)
)

顺便说一句,它的拼写是receiver

关于django - 过滤查询以获取两个 friend 之间的聊天消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75466865/

相关文章:

django - 在具有 Angular 前端的简单 Django Rest Framework 应用程序中会发生什么?

python - 动态限制相关字段的查询集

Django 管理员 : Unique email verification fails against self

python - Django 如何授予保留端口号?

django - Django queryset中的Q对象

javascript - 用于显示实时消息控制台的 Django(Dajax/Jquery?)插件

python - 带外键的 Django 表单

python - factory_boy 对象似乎缺少主键

django - 如何在 django rest 框架中为枚举字段创建序列化程序

django - 相关模型 ID 在 valid_data 中丢失,即使它存在于请求中