gpt4 book ai didi

python - 在 Django 中获取最新的不同对象

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:51 25 4
gpt4 key购买 nike

目前我有一个简单的消息聊天应用。

class Person(models.Model):
user = models.OneToOneField(User, primary_key=True)
sex = models.CharField(max_length=1, null=True, blank=True)

class Message(models.Model):
sender = models.ForeignKey(Person, related_name= 'sent')
recipient = models.ForeignKey(Person, related_name = 'received')
created = models.DateTimeField(auto_now_add=True, null = True, blank = True)
message = models.CharField(max_length=500)
conversation_id = models.CharField(max_length = 90)

我使用 Django Tastypie 作为我的休息 API。我想创建一个收件箱,类似于 Facebook 的收件箱,其中对话按最新排序。最近的消息对话会显示在收件箱的顶部。

“conversation_id”是发件人用户名和收件人用户名的组合。

例如,如果用户 Kyle 向用户 Alex 发送消息,则 conversation_id 将为“alexkyle”。

如果 Alex 给 Kyle 发消息,它仍然是“alexkyle”。如果亚历克斯给鲍勃发消息,它将是“alexbob”。

我已将其设置为 conversation_id 将始终按照唯一的字母顺序排列。 conversation_id 是我用来区分对话的。

我有以下资源:

class MessageResource(ModelResource):
sender = fields.ForeignKey(PersonResource, 'sender', full =True)
recipient= fields.ForeignKey(PersonResource, 'recipient', full=True)
class Meta:
queryset = Message.objects.all()
allowed_methods = ['get']
resource_name = 'message-list'
fields = ['message', 'sender', 'recipient', 'created', 'id', 'conversation_id', 'username']
authorization = Authorization()
authentication = BasicAuthentication()
include_resource_uri = False

def get_object_list(self, request):
return super(MessageResource, self).get_object_list(request).filter(Q(sender__user = request.user) | Q(recipient__user = request.user)).distinct('conversation_id').order_by('conversation_id','-created')

但是这有效!它按字母顺序发送数据,而不是按最近的对话发送数据。为了使用 distinct,我必须使用 order_by。问题是我不希望数据按字母顺序排列。我希望它按照最新对话的顺序排列。我该怎么做呢?

最佳答案

你的最后一行应该是这样的

return super(MessageResource, self).get_object_list(request).filter(Q(sender__user = request.user) | Q(recipient__user = request.user)).distinct('conversation_id').annotate(last_created=MAX(created)).order_by('-last_created')

在代码中,我使用了 MAX 方法,应该使用以下方法导入:

from django.db.models import Max

顺便说一句,史蒂夫说得有道理! conversation_id 对我来说似乎有点问题。

更新 1

要使用带注释的分组,应调用 values 或 values_list 方法:

return super(MessageResource, self).get_object_list(request).filter(Q(sender__user = request.user) | Q(recipient__user = request.user)).values('conversation_id').annotate(last_created=Max(created), distinct=True).order_by('-last_created')

关于python - 在 Django 中获取最新的不同对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19799354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com