首页 > 解决方案 > django; 有没有办法组合过滤对象的结果

问题描述

我是 Django 新手,我正在过滤一个对象,但也许我正在使用愚蠢的方式。如果发送者和接收者匹配,我想要做的是获取名为 Message 的对象。我正在创建一个类似聊天的页面。目前'views.py'是这样的,

def  message(request, user_id):
'''Direct message between users'''

    #Get an user that the user is sending messages to
    someone = CustomUser.objects.get(id=user_id)

    #Get past messages

    past_messages = Message.objects.filter(someone=someone, user=request.user)

models.py是这样的

class Message(models.Model):
    text = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    #Has a relationship with the user
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='myself')

    #Has a relationship with the someone who the user is talking to
    someone = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='someone')

但是对于这种方式,我只能收到我发送的消息,而无法收到我正在聊天的用户发送给我的消息。

所以我想知道是否有一种方法可以组合过滤对象的结果,基本上我想同时获取用户发送给某人的消息和某人发送给用户的消息并按日期排序。但是我没有想出一个好的方法来做到这一点。谁能给我提示?

基本上我想要做的是同时filter(someone=someone, user=request.user)获得filter(someone=request.user, user=someone)

标签: pythondjango

解决方案


好吧,我们可以制作一个过滤器来过滤两种情况的析取:

  1. userrequest.usersomeoneuser_id; 和
  2. someonerequest.useruseruser_id

我们可以这样写:

from django.db.models import Q

def  message(request, user_id):
    past_messages = Message.objects.filter(
        Q(user=request.user, someone_id=user_id) |
        Q(user_id=user_id, someone=request.user)
    )

因此,我们用一个Message查询在两个方向上查询 s 。


推荐阅读