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