简体   繁体   English

Django对象order_by给我重复的用户

[英]Django objects order_by give me duplicates users

I am trying to get all users (excepted request.user ) and order them by datetime of last message they received. 我正在尝试获取所有用户( request.user除外),并按他们收到的最后一条消息的日期时间对其进行排序。 Maybe I am doing it wrong. 也许我做错了。

@login_required
def get_users(request):
    if request.method == 'POST':
        users = list(User.objects.filter(~Q(username = request.user))
            .order_by('personal_messages__sent_date').values())
        return HttpResponse(dumps({'users': users}))
    return redirect('message:index')

dumps is from json_tricks. dumps来自json_tricks。 Data are received by a Vue.js object with JS fetch 数据由具有JS提取功能的Vue.js对象接收
My models.py 我的models.py

from django.db import models
from django.conf import settings

    class PersonalMessage(models.Model):
        text = models.TextField()
        sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='personal_messages', null=True, on_delete=models.SET_NULL)
        recipient = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL)
        sent_date = models.DateTimeField('sent date', auto_now_add=True)

The thing is if I only do users = list(User.objects.filter(~Q(username = request.user)).values()) it works well but if I add the order_by users = list(User.objects.filter(~Q(username = request.user)) .order_by('personal_messages__sent_date').values()) I get duplicates for each user. 事情是,如果我只做users = list(User.objects.filter(~Q(username = request.user)).values())它会很好,但是如果我添加order_by users = list(User.objects.filter(~Q(username = request.user)) .order_by('personal_messages__sent_date').values())我得到每个用户的重复信息。 Seems it returns each user n times if user is linked with n messages. 如果用户与n条消息链接,似乎它会向每个用户返回n次。
Maybe there is another way. 也许还有另一种方式。
Any Idea? 任何想法?

You need to use aggregation and the query looks like this: 您需要使用聚合 ,查询如下所示:

User.objects.filter(
    ~Q(username = request.user)
).annotate(
    last_message_sent_date=Max('personal_messages__sent_date')
).order_by(
    'last_message_sent_date'
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM