复杂的外键遍历中的棘手Django查询集创建、连接和排序问题

2024-04-24 23:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我维护了一个实时聊天网站(Python2.7,Django 1.5),任何用户都可以设置一个“title”语句,然后通过“public responses”与上述title语句下的其他人聊天。你知道吗

我想生成一个“用户活动日志”(queryset),它显示:

1)用户自己制作的所有标题声明

2)用户通过“回复”参与的由自己或他人制作的所有标题声明

3)1和2串联在一起,然后按每个标题语句中活动的新鲜程度排序。例如,用户在2分钟前创建的标题语句将优先于她在5分钟前创建的标题语句。但是,不是用户创建的标题语句,而是用户在1分钟前回复的标题语句,将优先于用户自己在2分钟前创建的标题语句。你知道吗

4)结果将按15分页

5)结果查询集中不应有重复条目。即,删除(1)和(2)联合时创建的任何重复标题。你知道吗

我试图在中的ListView类型类中实现上述功能视图.py,在get\u queryset()方法中。但我似乎不知道该怎么做。有人能帮我吗?你知道吗

我的型号.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)

视图.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\u on'排序时,我只使用标题时间戳排序。这是行不通的,因为正如我在上述要求(3)中所述,我最近发布回复的标题将优先于我最近创建的任何标题。例如,如果我在2分钟前创建了一个标题,那么我在1分钟前发布的关于我/其他人在24小时前创建的标题的回复仍然更新鲜。你知道吗

我该怎么做?效率也是一个考虑因素。如果你觉得需要的话,一定要问清楚。你知道吗


Tags: to用户true标题byobjectstitleon