Python 如何获取当前用户和其他用户之间的最后一条消息?

Python 如何获取当前用户和其他用户之间的最后一条消息?,python,sql,django,postgresql,python-2.7,Python,Sql,Django,Postgresql,Python 2.7,我有一个消息django模型,带有字段: id(主键) 用户\发送方(用户实例的外键) 用户\接收器(用户实例的外键) 发送日期(日期时间) 消息(字符) 状态(布尔值) 因此,我正在尝试获取当前用户和其他用户之间的所有最后消息 示例: 如果我有3个用户: John向Sarah发送消息(17.08.2015)(id=1) Sarah向John发送消息(20.08.2015)(id=2) John向Max发送消息(18.08.2015)(id=3) 我只需要获取ID为2和3的消息 我正在尝试此

我有一个消息django模型,带有字段:

  • id(主键)
  • 用户\发送方(用户实例的外键)
  • 用户\接收器(用户实例的外键)
  • 发送日期(日期时间)
  • 消息(字符)
  • 状态(布尔值)
因此,我正在尝试获取当前用户和其他用户之间的所有最后消息

示例:

如果我有3个用户:

John向Sarah发送消息(17.08.2015)(id=1)

Sarah向John发送消息(20.08.2015)(id=2)

John向Max发送消息(18.08.2015)(id=3)

我只需要获取ID为2和3的消息

我正在尝试此查询,但得到所有3条消息:

Message.objects.filter(
            Q(user_sender_id=1) |
            Q(user_receiver_id=1)).\
order_by('user_sender', 'user_receiver', '-send_date').\
distinct('user_sender', 'user_receiver')
那么,我做错了什么?为什么在使用distinct by外键后,我会收到3条消息

UPD#1:


要获取当前用户和其他用户之间的所有最后消息,请执行以下操作:

def is_latest(qs, message):
    # if contact exist in sent and received
    # take lastmessage contact
    if qs:
        if message.send_date < qs[0].send_date:
            return False
    return True

user = User.objects.get(id = 1)
sent = Message.objects.filter(user_sender=user).order_by('user_receiver','-send_date').distinct('user_receiver') 
received = Message.objects.filter(user_receiver=user).order_by('user_sender','-send_date').distinct('user_sender') 
messages = list(chain(sent, received))
contact_list = []
for message in messages:
    if message.user_sender == user:
        c = message.user_receiver                
        if not is_latest(received.filter(user_sender=c), message): continue
    else:
        c = message.user_sender
        if not is_latest(sent.filter(user_receiver=c), message): continue

    contact_list.append({'id':c.id,'email': c.email,'last_message': message.message})

print(contact_list)
def是最新的(qs,消息):
#如果发送和接收中存在联系人
#获取最新消息联系人
如果qs:
如果message.send_date
请显示您的模型的真实代码如果您希望通过此查询获取消息2和3,则您正在查找发送给John或来自John的消息。但消息1也是约翰发来的。@Pynchia更新了问题。@Ivan和什么?您能提供丢弃重复对外键的解决方案吗?@Ivan说您的查询不符合您的要求。它应该是
Message.objects.filter(user\u sender\u id=1)。latest('send\u date')
它看起来不错,但不能完全成功地工作。我正在用我的数据库测试它,它似乎总是只收到2条消息?为什么它会丢弃其他消息?因为对于每个查询集*,只有[:1]会收到一条消息。如果要接收最后五条消息,只需将第二个查询twow中的[:1]更改为[:5]!看起来很棒。记下答案,然后睡觉,明天再测试。谢谢:)它看起来不像我需要的那样工作。它选择所有消息,但我只需要当前用户和其他用户之间的一个(最新的)消息。发送和接收的查询集和[:1]将只带来一条消息,是否可以显示您的查询集代码?
sent = Message.objects.filter(user_sender_id=1).order_by('-send_date')[:1]
received = Message.objects.filter(user_receiver_id=1).order_by('-send_date')[:1]

from itertools import chain

messages = list(chain(sent, received))
def is_latest(qs, message):
    # if contact exist in sent and received
    # take lastmessage contact
    if qs:
        if message.send_date < qs[0].send_date:
            return False
    return True

user = User.objects.get(id = 1)
sent = Message.objects.filter(user_sender=user).order_by('user_receiver','-send_date').distinct('user_receiver') 
received = Message.objects.filter(user_receiver=user).order_by('user_sender','-send_date').distinct('user_sender') 
messages = list(chain(sent, received))
contact_list = []
for message in messages:
    if message.user_sender == user:
        c = message.user_receiver                
        if not is_latest(received.filter(user_sender=c), message): continue
    else:
        c = message.user_sender
        if not is_latest(sent.filter(user_receiver=c), message): continue

    contact_list.append({'id':c.id,'email': c.email,'last_message': message.message})

print(contact_list)