我维护一个实时聊天网站(Python2.7,Django 1.5),任何用户都可以设置“标题”声明,然后通过“公开回复”在所述标题声明下与其他人聊天。
我想制作一个'用户活动日志'(查询集),显示:
1)用户自己制作的所有标题声明
2)所有由用户通过“回复”参与的自己或其他人制作的标题声明
3)1& 2连接在一起,然后按活动在每个标题声明中的新鲜程度排序。例如。用户创建的标题声明 2分钟前优先于 5分钟前创建的标题声明。但是,用户未创建的标题声明,但她回复 1分钟前的标题声明,将优先于她自己创建的前标题声明 2分钟前。
4)结果将由15
分页5)结果查询集中应该没有重复的条目。即,删除在(1)和(2)联合时创建的任何重复标题。
我正在尝试在get_queryset()方法内的views.py中的ListView类型类中实现上述目的。但似乎无法绕过如何做到这一点。任何人都可以帮助我吗?
我的 models.py 包括:
class Title(models.Model):
description = models.TextField(validators=[MaxLengthValidator(500)])
submitter = models.ForeignKey(User)
submitted_on = models.DateTimeField(auto_now_add=True)
cagtegory = models.CharField("Category", choices=CATEGS, default=1, max_length=25)
image_file = models.ImageField(upload_to=upload_to_location, null=True, blank=True )
class Publicreply(models.Model):
submitted_by = models.ForeignKey(User)
answer_to = models.ForeignKey(Title)
submitted_on = models.DateTimeField(auto_now_add=True)
description = models.TextField(validators=[MaxLengthValidator(250)])
category = models.CharField("Category", choices=CATEGS, default=1, max_length=20)
在 views.py 中,相关代码为:
class UserActivityView(ListView):
model = Title
slug_field = "username"
template_name = "user_activity.html"
paginate_by = 15
def get_queryset(self):
username = self.kwargs['slug']
user = User.objects.filter(username=username)
title_list1 = Title.objects.filter(submitter=user)
reply_list = Publicreply.objects.filter(submitted_by=user)
titles_with_replies = [reply.answer_to.id for reply in reply_list]
title_list2 = Title.objects.filter(id__in=titles_with_replies)
title_list3 = (title_list1 | title_list2).order_by('-submitted_on').distinct()
return title_list3
此解决方案对我不起作用,因为当我按'submitted_on'排序时,我最终只使用标题时间戳进行排序。这不起作用,因为正如我在上面的要求(3)中所述,我最近发布回复的标题将优先于我最近创建的标题。例如。如果我创建了一个 2分钟之前的标题,我在24小时之前创建的标题我/其他人发布的 1分钟之前的回复仍然更新鲜
我该怎么做?效率也是一个考虑因素。如果您觉得需要,请要求更清晰。