我正在try 创建一个聊天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)

现在,我正在try 编写API视图,以获取仅属于me和我正在聊天的person的所有消息.

让我详细说明一下:假设Destiny正在发送Sammy条短信,肯定会有很多消息在我(Destiny)和用户(Sammy)之间发送,所以我想要收到所有这些短信.

这就是我写下的观点,就是为了这样做

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

URL

    path("api/get-messages/<sender_id>/<reciever_id>/", views.GetMessages.as_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
    }
]

如果我交换发送者id和接收者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
    }
]

Some images enter image description here enter image description here enter image description here

推荐答案

您也可以使用此方法,

messages = ChatMessage.objects.filter(
    sender__in=[sender_id, reciever_id], reciever__in=[reciever_id, sender_id]
)

Django相关问答推荐

在保存新实例之前删除一个实例(Django模型保存方法)

Django:添加第二个';详细';用于检索额外信息的视图

新的 Django 开发人员无法在网站上显示Hello World,而不是默认安装成功页面

try 获取静态文件路径时 Django 给出错误

防止 django 将_id附加到外键字段

当我告诉它时,如何使用 Django 的记录器来记录回溯?

使用基于类的 UpdateView 在 Django 中更新用户模型

Django-Registration:邮箱作为用户名

Django 管理命令参数

Django:如何从模板调用视图函数?

在 Django 中获取下一个和上一个对象

如何在 Django Rest Framework SimpleRouter 上使斜杠可选

django - 如何使翻译工作?

使用直通模型了解 Django 中的多对多字段

Django manage.py:在其依赖之前应用迁移

如何在 django 中分离我的模型?

django过滤器超过几天?

在 Django shell 启动时自动导入模型

Django中reverse()和reverse_lazy()的区别

在 django 中获取空查询集的类名