代码之家  ›  专栏  ›  技术社区  ›  Samir Tendulkar

如何按创建时的时间顺序排列来自不同模型的帖子

  •  0
  • Samir Tendulkar  · 技术社区  · 7 年前

    简介: 我有三个模型 user , post , group . 用户可以发布帖子,但是每个帖子必须属于一个组。我有400个固定组。用户必须从现有的400个小组中选择他们的职位。用户无法添加、删除、更新 的。

    此外:

    用户可以成为组的成员,当他们单击某个组时。他们看到了那群人的所有帖子。

    用户可以跟随展开其他用户。

    **我现在拥有的:**当用户登录时。在他的主页上他看到了。他所属的每个小组的所有职位。当所有组的所有帖子都完成时。然后他看到所有跟随他的人的岗位

    我想要的: 我想要 按时间安排岗位 例如:如果他跟随的人之一 刚写了篇帖子 然后那篇文章是第一篇。按时间顺序,第二个职位在他所属的一个组中。那篇文章排在第二位。。。你明白了

    下面是我的模型

    class Post(models.Model):
        user = models.ForeignKey(User, related_name='posts')
        group = models.ForeignKey(Group, related_name='posts')
        title = models.CharField(max_length=250, unique=True)
        message = models.TextField()
        created_at = models.DateTimeField(auto_now=True)
    
        class Meta:
            ordering = ['-created_at']
    
    class Group(models.Model):
        name = models.CharField(max_length=250, unique=True)
        members = models.ManyToManyField(User, through='GroupMember')
    

    我的观点.py

    class Homepage(TemplateView):
    template_name = 'home.html'
    
        def get_context_data(self, **kwargs):
            context = super(Homepage, self).get_context_data(**kwargs)
            posts_of_people_i_follow = []
            posts_from_groups_that_i_member = []
            if self.request.user.is_authenticated():
                my = self.request.user
                for user in my.following.all():
                    posts_of_people_i_follow += user.posts.all()
                    posts_of_people_i_follow.save()
                for group in my.group_set.all():
                    posts_from_groups_that_i_member += group.posts.all()
                    posts_from_groups_that_i_member.save()            
            context['posts_of_people_I_follow_list'] = posts_of_people_i_follow
            context['posts_from_groups_that_i_member'] = posts_from_groups_that_i_member
            return context
    

    在我的 模板 我现在有

    {% for post in posts_from_groups_that_i_member %}
      {{ post.title }}
      {{ post.message }}
    {% endfor %}
    
    {% for post in posts_of_people_I_follow_list %}
      {{ post.title }}
      {{ post.message }}
    {% endfor %}
    

    选择2:在打破我的头在这一段时间后,我一直在尝试一种不同的方法。但这看起来很贵

    在用户配置文件模型中

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
    
        def get_all_posts(self):
            my = self.user
            all_posts_for_this_user = []
            for user in my.following.all():
                all_posts_for_this_user += user.posts.all()
                all_posts_for_this_user.save()
            for group in my.group_set.all():
                all_posts_for_this_user += group.posts.all()
                all_posts_for_this_user.save()
             return all_posts_for_this_user
    

    然后在我的模板中

     {% for post in user.profile.get_all_posts %}
        {{ post.title }}
        {{ post.message }}
     {% endfor %}
    

    有人能想出更好的解决办法吗。或者这可以吗

    2 回复  |  直到 7 年前
        1
  •  0
  •   Dogushan KAYA    7 年前

    如果我理解正确,您需要在post模型中输入post date,然后您可以按post.objects.ordey_by('post_date')订购post

    https://docs.djangoproject.com/en/2.1/ref/models/querysets/#django.db.models.query.QuerySet.order_by

        2
  •  0
  •   Sosthenes Kwame Boame    7 年前

    使用queryset上的order_by()方法修改视图类,该方法获取post对象并根据它们创建的时间对其进行筛选(此处的“created_at”字段很方便)。

    将此添加到“主页”视图类:

    def get_queryset(self):
            queryset_list = Post.objects.order_by('-created_at')
    

    进一步的阅读可以在这里找到: https://docs.djangoproject.com/en/2.1/ref/models/querysets/


    编辑

    我认为模板渲染问题应该有自己的问题吗?
    在模板中,尝试以下操作:

    {% for post in posts_from_groups_that_i_member %}
        {% if post in posts_of_people_I_follow_list %}
            {{ post.title }}
            {{ post.message }}
        {% endfor %}
    {% endfor %}
    

    就性能而言,这可能不是最好的选择,但应该是可行的。告诉我你的发现。