Python 如何修复:TypeError:QuerySet.annotate()接收到非表达式:eqmunir
我在我的网站上添加了一个相似的功能,用户可以在这里喜欢彼此的帖子 我已经成功地做到了这一点,但有一个问题。这是检查用户是否已经喜欢该帖子,这必须在我的主视图中具体执行 这样我就可以呈现我的主页了。为了解决这个问题,我在检索帖子时对帖子执行了.annotate(),查看用户是否喜欢帖子 然后我将其传递到我的主模板,并检查用户是否存在于posts likes属性中 这是相关代码 models.py:Python 如何修复:TypeError:QuerySet.annotate()接收到非表达式:eqmunir,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我在我的网站上添加了一个相似的功能,用户可以在这里喜欢彼此的帖子 我已经成功地做到了这一点,但有一个问题。这是检查用户是否已经喜欢该帖子,这必须在我的主视图中具体执行 这样我就可以呈现我的主页了。为了解决这个问题,我在检索帖子时对帖子执行了.annotate(),查看用户是否喜欢帖子 然后我将其传递到我的主模板,并检查用户是否存在于posts likes属性中 这是相关代码 models.py: class Post(models.Model): file = models.ImageF
class Post(models.Model):
file = models.ImageField(upload_to='images/')
summary = models.TextField(max_length=600)
pub_date = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
likes = models.ManyToManyField(User, through='Like', related_name='likes')
def __str__(self):
return self.user.username
def pub_date_pretty(self):
return self.pub_date.strftime('%b %e %Y')
def summary_pretty(self):
return self.summary[:50]
@property
def total_likes(self):
return self.likes.count()
class Like(models.Model):
status = models.BooleanField()
post = models.ForeignKey(Post, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
views.py:
def home(request):
posts = Post.objects.all()
liked_or_not = Post.objects.annotate(likes__user=request.user)
return render(request, 'posts/home.html', {'posts': posts, 'liked_or_not': liked_or_not})
home.html:
{% if liked_or_not == True %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Unlike {{ post.total_likes }} </button></a>
{% else %}
<a href="javascript:{document.getElementById('likepost{{ post.id }}').submit()}"><button class="btn btn-primary btn-lg btn-block"><span class="oi oi-caret-top"></span> Like {{ post.total_likes }} </button></a>
{% endif %}
<form id="likepost{{ post.id }}" method="POST" action="{% url 'likepost' post.id %}">
{% csrf_token%}
<input type="hidden">
</form>
{%if liked\u or\u not==True%}
{%else%}
{%endif%}
{%csrf_令牌%}
我不太明白你想做什么。如果您想检查用户是否至少喜欢一篇文章,您可以这样做:
liked_or_not = Like.objects.filter(user=request.user).exists
liked_or_not = Likes.objects.filter(post_id=post_id, user=request.user).exists()
如果要检查用户是否喜欢某个特定帖子,可以按如下方式对其进行点画:
liked_or_not = Like.objects.filter(user=request.user).exists
liked_or_not = Likes.objects.filter(post_id=post_id, user=request.user).exists()
注释有不同的用途。它使用提供的查询表达式列表注释QuerySet中的每个对象。表达式可以是简单值、对模型(或任何相关模型)上字段的引用,也可以是对与查询集中的对象相关的对象计算的聚合表达式(平均值、总和等)。请在此处阅读更多信息对于那些来这里寻找调试错误消息的其他可能性的人,我犯了一个错误,输入了一个类似于
Like.objects.filter(user=request.user).value('status',flat=True)
#而不是正确的
Like.objects.filter(user=request.user).values\u list('status',flat=True)
我遇到了类似的问题,并使用.annotate解决了这个问题下面是我对models.py中Like的定义
class Like(models.Model):
user = models.ForeignKey(
"users.User", on_delete=models.CASCADE, related_name="likes"
)
writing = models.ForeignKey(
"writings.Writing", on_delete=models.CASCADE, related_name="likes"
)
in views.py
filter_kwargs = {}
filter_kwargs["writing"] = OuterRef("pk")
filter_kwargs["user"] = request_user
subquery = Like.objects.filter(**filter_kwargs)
writing = (
Writing.objects.annotate(user_likes=Exists(subquery))
.get(id=id)
)