Объект ManyToManyDescriptor не имеет атрибута «все» - PullRequest
0 голосов
/ 29 марта 2020

У меня есть django модель, которая выглядит следующим образом:

class Post(models.Model):
    user        = models.ForeignKey(settings.AUTH_USER_MODEL, default=1,on_delete=models.CASCADE)
    title       = models.CharField(max_length=120)
    likes       = models.ManyToManyField(settings.AUTH_USER_MODEL,blank=True,related_name='post_likes')

С помощью этого переключателя пользователь может полюбить сообщение.

class PostLikeApiToggle(APIView):
    authentication_classes = (authentication.SessionAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    def get(self, request, slug=None, format=None):
        obj = get_object_or_404(Post, slug=slug)
        like_count = 0
        user = self.request.user
        liked = False

        if user in obj.likes.all():
            liked = False
            like_count = 0
            obj.likes.remove(user)
        else:
            liked = True
            like_count = like_count + 1
            obj.likes.add(user) 
            messages.add_message(self.request, messages.INFO, 'You liked the post!')
        data = {
            "liked":liked,
            "like_count":like_count
        }
        return Response(data)

Это представление, над которым я работаю:

@login_required
def m_userprofieview(request):
    own_posts = Post.objects.filter(user=request.user)
    allposts = Post.objects.all()
    if request.user in allposts.likes.all():
        liked_posts = liked_posts 
    else:
        liked_posts = None
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST,instance=request.user)
        i_form = ProfilePictureUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if u_form.is_valid():
            u_form.save()
            messages.success(request,'Your information has been updated !')
            return redirect('/')
        if i_form.is_valid():
            i_form.save()
            messages.success(request,'Your information has been updated !')
            return redirect('/')
    else:
        u_form = UserUpdateForm(instance=request.user)
        i_form = ProfilePictureUpdateForm(instance=request.user.profile)
    context = {
        'u_form':u_form,
        'i_form':i_form,
        'own_posts_list':own_posts,
        'liked_posts_list':liked_posts
    }
    return render(request,'m_userprofile.html',context)

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

Это то, что я пробовал:

if request.user in Post.likes.all():
    liked_posts = liked_posts 
else:
    liked_posts = None

Возвращает следующую ошибку: объект «ManyToManyDescriptor» не имеет атрибута «все»

allposts = Post.objects.all()
if request.user in allposts.likes.all():
    liked_posts = liked_posts 
else:
    liked_posts = None

Возвращает следующую ошибку: объект «QuerySet» не имеет атрибута «лайки»

Как я могу проверить, находится ли пользователь в obj.likes.all, где obj - это все сообщения, а не одна?

Спасибо

1 Ответ

1 голос
/ 29 марта 2020

Поскольку вы передали related_name='post_likes' в ManyToManyField, вы можете получить доступ ко всем Post для пользователя, используя это связанное имя

liked_posts = request.user.post_likes.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...