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

cl25kdpy  于 2023-02-17  发布在  Go
关注(0)|答案(2)|浏览(143)

我正在尝试创建一个聊天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视图,以获取仅属于和正在与我聊天的的所有消息。
让我详细说明:假设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

网址

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

如果我交换sender_id和reciever_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
    }
]

某些图像

bq3bfh9z

bq3bfh9z1#

您可以在此处使用Q对象:

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

uplii1fm

uplii1fm2#

您也可以使用此方法,

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

相关问题