Я не могу сделать запрос в django, чтобы отфильтровать сообщения от тех пользователей, за которыми в данный момент следит пользователь, вошедший в систему

#python #mysql #django #django-models #erd

#питон #mysql #джанго #джанго-модели #erd

Вопрос:

Я работаю над проектом Django, в котором пользователь может подписываться на других пользователей, создавать посты и так далее, как в Twitter или Instagram. Однако у меня есть проблема с написанием запросов в views.py чтобы отфильтровать все сообщения от людей, за которыми в данный момент следит пользователь, вошедший в систему. Здесь я делюсь своим views.py функция, модель, шаблон и соответствующая диаграмма ER.

views.py

 def followerspost(request):  user = request.user  profile = Profile.objects.filter(user = user)  followings = user.profile.followings.all()  for following in followings:  posts = NewPost.objects.filter(user = following)   return render(request,"network/following.html",{  "user" : user,  "profile" : profile,  "followings" : followings,  "posts" : posts,  })  

models.py

 class NewPost(models.Model):  user = models.ForeignKey(User, on_delete = models.CASCADE)  post = models.TextField()  timestamp = models.DateTimeField(auto_now_add = True)   def __str__(self):  return f"{self.post}"  class Profile(models.Model):  user = models.OneToOneField(User, on_delete = models.CASCADE)  picture = models.ImageField(blank=True,null=True,upload_to="images/")  followers = models.ManyToManyField(User, blank=True, related_name="followers")  followings = models.ManyToManyField(User,blank = True, related_name="followings")  

Я разработал свою базу данных в соответствии со следующей схемой ER. введите описание изображения здесь

urls.py

 urlpatterns = [  path("profile/lt;int:idgt;/following/addfollower",views.followersPeople,name="addfollower"), path("profile/lt;int:idgt;/following/removefollower",views.followersRemove,name="removefollower"), path("following",views.followerspost,name="following"),]  static(settings.MEDIA_URL, document_root= settings.MEDIA_ROOT)  

following.html

 lt;h1gt;All Postslt;/h1gt;    lt;div id="posts" class="card"gt;  lt;div class="card-body"gt;  {% for posts in posts %}  lt;ulgt;  lt;li class="card"gt;   lt;div class="card-body"gt;  lt;h5 class="card-title"gt;lt;a style="text-decoration: none;" href="{% url 'profile' posts.user.id %}"gt;{{ posts.user }}lt;/agt;lt;/h5gt;   lt;h6 class="card-subtitle text-muted"gt;{{ posts.timestamp }}lt;/h6gt;  lt;h3 class="card-text"gt;{{ posts.post }}lt;/h3gt;  lt;/divgt;  lt;/ligt;  lt;/ulgt;   {% empty %}  lt;h6gt;No post availabel 😔lt;/h6gt;  {% endfor %}  lt;/divgt;    lt;/divgt; 

Но когда я посещаю following.html, он отображает сообщения только от одного пользователя (за которым следует пользователь, вошедший в систему в данный момент) и не отображает никаких сообщений от других. Что мне теперь делать?

Комментарии:

1. При извлечении сообщений вы каждый раз назначаете переменную posts. Таким образом, вы получаете последнее значение. Попробуйте занести их в список.

Ответ №1:

попробуйте это

 def followerspost(request):  user = request.user  profile = Profile.objects.filter(user = user)  followings = user.profile.followings.all()  posts = NewPost.objects.filter(user__in= followings) #new   return render(request,"network/following.html",{  "user" : user,  "profile" : profile,  "followings" : followings,  "posts" : posts,  })  

Ответ №2:

 for following in followings:  posts = NewPost.objects.filter(user = following)   

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

просто сделайте что-нибудь подобное и снимите петлю

 posts = NewPost.objects.filter(user__in = followings)