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

时间:2018-12-15 19:44:02

标签: django python-3.x django-templates django-views

简介:我有3个模型userpostgroup。用户可以发表帖子,但是每个帖子必须属于一个组。我有400个固定小组。用户必须从现有的400个组中进行选择。用户无法添加,删除或更新group

此外:

用户可以在单击特定组时成为组的成员。他们会看到该组中的所有帖子。

用户可以关注-取消关注其他用户。

**我现在拥有的内容:**用户登录时。在他的主页上,他看到了。他所属的每个小组的所有职位。所有组中的所有帖子都处理完毕。然后,他会看到他一一跟随的所有人员的帖子

我想要的东西:我希望按时间排列帖子 示例:如果他跟随的一个人只是写了一篇帖子,那么该帖子就是第一篇。按时间顺序,第二个职位属于他所属的一个小组。该帖子排在第二...您有个主意

下面是我的模型

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')

我的views.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 个答案:

答案 0 :(得分:0)

如果我理解正确,则需要在Post模型中指定发布日期,然后可以通过Post.objects.ordey_by('post_date')

来订购帖子

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

答案 1 :(得分:0)

在查询集上使用“ order_by()”方法来修改您的视图类,该方法可获取您的帖子对象并根据其创建时间对其进行过滤(“ 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 %}

就性能而言,它可能不是最佳选择,但它应该可以工作。让我知道你的发现。