Django:不同的用户过滤

时间:2017-11-14 06:58:18

标签: python django

我正在尝试构建一个消息传递应用。这是我的模特,

class Message(models.Model):
    sender = models.ForeignKey(User, related_name="sender")
    receiver = models.ForeignKey(User, related_name="receiver")
    msg_content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

这是我在视野中尝试的,

data = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user))

在模板中,

{% for abc in data %}
    {{ abc.receiver }} <br/>
{% endfor %}

在这里,我希望过滤不同的接收者,并根据最近向request.user发送新消息的事实重新排序(正如我们在社交媒体平台上看到的那样)。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

在查询中添加here

data = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).values('receiver').distinct().order_by()

此查询将从消息对象

中获取所有不同的接收者

更新的答案: -

.distinct([* fields])将与postgresql一起使用

data = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).order_by('receiver','-created_at').distinct('reciever')

答案 1 :(得分:0)

您需要编写两个查询。一种是获取所有消息,另一种是按顺序获取收件人列表。以下代码中的receiver_list将为您提供接收者列表。根据接收者列表,您可以过滤掉模板中的消息。

from django.db.models.aggregates import Max
data = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user))
receiver_list = data.filter(sender=request.user).values('receiver').annotate(max_time=Max('created_at').order_by('-max_time')