【问题标题】:How to arrange posts from different models in Order of time when they were created如何按创建时间的顺序排列来自不同模型的帖子
【发布时间】:2019-05-16 17:22:59
【问题描述】:

简介:我有 3 个模型 userpostgroup。用户可以发布帖子,但是每个帖子必须属于一个组。我有 400 个固定组。用户必须从现有的 400 个组中选择他们的帖子。用户不能添加、删除、更新group's。

进一步:

用户可以成为组的成员,当他们点击某个组时。他们会看到该组中的所有帖子。

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

**我现在拥有的:**当用户登录时。在他的主页上,他看到了。他所属的每个小组的所有帖子。当所有组的所有帖子都完成时。然后他会一一看到他关注的所有人的帖子

我想要什么:我想要帖子按时间排列 示例:如果他关注的一个人刚刚写了一篇文章,那么该文章是第一个。按时间顺序,第二个职位是在他所属的一个小组中。那篇文章排在第二位......你明白了

以下是我的模型

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 %}

谁能想到更好的解决方案。或者这样可以吗

【问题讨论】:

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


    【解决方案1】:

    如果我理解正确,您的 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 组中按时间顺序排列它们。示例如果我做了Post.objects.all,帖子将按时间顺序排列。但就我而言。我们正在从不同的地方获取帖子列表。例子。让我们想象有 3 组。 forloop 将按时间顺序显示 1 组中的所有帖子。然后是第二组的帖子。完成所有组的帖子后,它将开始按时间顺序显示第一个关注用户的帖子。那么下一个用户...
    • 你可以添加一些你的主页截图吗?
    【解决方案2】:

    通过在查询集上使用“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 %}
    

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

    【讨论】:

    • 知道它在模板中的外观
    • 目前我在模板中选择posts_of_people_I_follow_listposts_from_groups_that_i_member 来获取帖子
    • 您可以使用 if/else 语句来实现您想要的。您可以在模板中发布该标记块吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多