簡體   English   中英

如何修復:類型錯誤:QuerySet.annotate() 收到非表達式:eqmunir

[英]How to fix: TypeError: QuerySet.annotate() received non-expression(s): eqmunir

我在我的網站中添加了一個類似的功能,用戶可以在其中喜歡彼此的帖子。

我已經成功地做到了這一點,但是有一個問題。 這是檢查用戶是否已經喜歡該帖子,這必須在我的主頁視圖中專門執行。

這樣我就可以呈現我的主頁。 為了解決這個問題,我在檢索帖子時對帖子執行 .annotate() ,看看用戶是否喜歡帖子。

然后我將它傳遞到我的主頁模板並檢查用戶是否存在於帖子喜歡屬性中。

這是相關的代碼。

模型.py:

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)

視圖.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})

主頁.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>

對於那些來這里調試錯誤消息的其他可能性的人,我犯了一個錯誤並輸入了類似於

Like.objects.filter(user=request.user).values('status', flat=True)
# instead of the correct
Like.objects.filter(user=request.user).values_list('status', flat=True)

我不太明白你想做什么。 如果您想檢查用戶是否喜歡至少一篇文章,您可以這樣做:

liked_or_not = Like.objects.filter(user=request.user).exists

如果您想檢查用戶是否喜歡某個特定的帖子,您可以這樣點:

liked_or_not = Likes.objects.filter(post_id=post_id, user=request.user).exists()

annotate 有不同的目的。 它使用提供的查詢表達式列表注釋 QuerySet 中的每個對象。 表達式可以是一個簡單的值、對模型(或任何相關模型)上的字段的引用,或者是對與模型中的對象相關的對象進行計算的聚合表達式(平均值、總和等)。查詢集。 在這里閱讀更多https://docs.djangoproject.com/en/2.2/ref/models/querysets/#annotate

我遇到了類似的問題並使用 .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"
    )

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM