Вступление: У меня есть 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 %}
Может кто-нибудь придумать лучшее решение.Или это нормально