django;有没有办法组合过滤对象的结果

时间:2018-07-02 20:34:37

标签: python 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)

1 个答案:

答案 0 :(得分:0)

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

  1. userrequest.user,而someoneuser_id;和
  2. someonerequest.user,而useruser_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