[英]Django: how to make an “order by” filter based on a foreign key
我有一个Conversation
模型和一个Message
模型。 Message
的日期date_creation
。
Conversation
通过这样的messages
产生了很多Message
:
class Message(models.Model):
date_last_modif = models.DateTimeField(auto_now=True)
src = models.ForeignKey('User', related_name='message_src')
dst = models.ForeignKey('User', related_name='message_dst')
is_read = models.BooleanField(default=False)
message = models.TextField(null=True, blank=True)
class Conversation(models.Model):
messages = models.ManyToManyField(Message, related_name='conversations')
我想做的是先获取所有未读消息的会话,然后按最新消息排序。
因此,这是我的第一个过滤器,它获取所有尚未读取消息的对话:
p = current_user # code omitted for sake of clarity
convs_not_read = Conversation.objects.filter(
Q(messages__dst=p, messages__is_read=False)).distinct()
请注意,我需要与众不同,以仅一次获得对话ID,否则,如果有多个未读消息,则与该对话中有未读消息的ID一样多。
从现在开始,我正在尝试使所有对话都具有“否”的未读消息,并按最新消息排序。
我开始于:
convs_read = Conversation.objects
.filter(messages__dst=p)
.exclude(pk__in=convs_not_read.values_list('id', flat=True))
.distinct()
此方法有效,但不会被最新消息过滤。 我被困在这里。 你会怎么做?
如果我尝试:在此查询中的任何位置添加.order_by('-messages__date_last_modif')
,则此操作无效,在这里:
.filter(messages__dst=p)
.order_by('-messages__date_last_modif')
.exclude(pk__in=convs_not_read.values_list('id', flat=True))
.distinct()
...或这里:
.filter(messages__dst=p)
.exclude(pk__in=convs_not_read.values_list('id', flat=True))
.distinct()
.order_by('-messages__date_last_modif')
...不会改变结果
尝试使用:
my_query.order_by('-conversations__date_last_modif')
因为您将related_name
用作"conversations"
我正在手动执行此“排序”:首先按消息日期排序,然后为每条消息添加其对话的pk
(如果尚未添加)。 我敢肯定这不是最优化的解决方案,因此,如果您有基于此(工作)解决方案的建议,我就是您的助手!
l = []
for m in Message.objects.filter(dst=p).order_by('-date_last_modif'):
for c in m.conversations.all():
if c not in l:
l.append(c.pk)
conversations_read = [c for c in Conversation.objects.filter(pk__in=l)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.