Как упорядочить посты из разных моделей в порядке времени их создания - PullRequest
0 голосов
/ 15 декабря 2018

Вступление: У меня есть 3 модели user, post, group.Пользователь может создавать сообщения, однако каждое сообщение должно принадлежать группе.У меня 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')

my 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 голосов
/ 15 декабря 2018

Измените ваш класс представления с помощью метода order_by () в наборе запросов, который выбирает ваши пост-объекты и фильтрует их в соответствии с тем, когда они были созданы (здесь полезно поле 'creation_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 %}

С точки зрения производительности, это может быть не лучший вариант, но он должен работать.Дайте мне знать ваши выводы.

0 голосов
/ 15 декабря 2018

если я правильно понимаю, вам нужна дата публикации в вашей модели сообщений, тогда вы можете заказать сообщения по Post.objects.ordey_by ('post_date')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...