【问题标题】:Keep getting this error 'post' object has no attribute 'liked_by_set'不断收到此错误“post”对象没有属性“liked_by_set”
【发布时间】:2015-02-13 04:31:13
【问题描述】:

我不断收到此错误“post”对象没有属性“liked_by_set”

Models.py 
liked_by = models.ManyToManyField(User, related_name='likedby')

views.py 

def like_unlike_article(request, post_id):
    a = post.objects.get(id=post_id) 
    user = request.user

    if user is a.liked_by_set.all():
        # User has liked it before, means he wants to unlike it
        a.liked_by_set.remove(user) # remove him from ``liked_by`` set
        a.likes -= 1 # unlike the article
    else:
        # User wants to like it
        a.liked_by_set.add(user) # add him to ``liked_by`` set
        a.likes += 1 # like the article

    a.save()

有什么帮助吗?

【问题讨论】:

  • 你必须向我们展示你的模型才能得到这个问题的答案。
  • 我认为 .all() 返回一个列表,然后if user in a.liked_by.all(): a.liked_by.remove(user)

标签: django django-models django-views


【解决方案1】:

您应该使用“liked_by”而不是“liked_by_set”:

a.liked_by.all()

还要注意user is a.liked_by_set.all() 将始终返回False。使用in 子句:

if user in a.liked_by.all():
    ...

【讨论】:

    【解决方案2】:

    有多种方法可以解决此问题。

    class Post:
        liked_by = models.ManyToManyField(User, related_name='likedby')
    

    这将使以下事情成为可能

    a = post.objects.get(id=post_id)
    a.liked_by.all() # [<User: 1>, <User: 2>] 
    
    or
    
    user = request.user
    user.liked_by_set.all() # [<Post: 1>, <Post: 2>]
    

    我将创建以下语句

    if a.liked_by.get(id=user.id):
        ...
    else:
        ...
    

    if user.liked_by_set.get(id=post_id):
        ...
    else:
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2023-02-05
      • 2021-11-16
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多