如何在 Django 中使用查询集计算字典的值
How to count the value of dictionary using queryset in django
我在 django 中使用 .value('post_id') 来获取以下值。
<QuerySet [{'post_id': 3}, {'post_id': 2}, {'post_id': 1}, {'post_id': 3}]>
如果统计每个字典的值,分别是一、一、二。我应该寻找哪个查询集,而不是将其计为没有 for 循环的查询集?
models.py
class Like (models.Model) :
liked_people = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='liked_people', null=True)
您应该注释 target 模型,因此:
from django.db.models import <b>Count</b>
Post.objects.annotate(
<b>number_of_liked=Count('liked_people')</b>
)
由此产生的 Post
个对象将有一个额外的属性 .number_of_liked
,其中包含相关 Liked
的数量。
您可以进一步过滤 Like
个对象,例如:
from django.db.models import <b>Count</b>
Post.objects.filter(
<b>liked_people__liked_people=<i>my_user</i></b>
).annotate(
number_of_liked=Count('liked_people')
)
这将排除 Post
个与 liked_people=my_user
没有相关 Like
个对象的对象。您也可以包括这些,但随后使用 .number_of_liked = 0
,使用:
from django.db.models import <b>Count, Q</b>
Post.objects.annotate(
number_of_liked=Count(
'liked_people'<b>,
filter=Q(liked_people__liked_people=<i>my_user</i>)</b>
)
)
我在 django 中使用 .value('post_id') 来获取以下值。
<QuerySet [{'post_id': 3}, {'post_id': 2}, {'post_id': 1}, {'post_id': 3}]>
如果统计每个字典的值,分别是一、一、二。我应该寻找哪个查询集,而不是将其计为没有 for 循环的查询集?
models.py
class Like (models.Model) :
liked_people = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='liked_people', null=True)
您应该注释 target 模型,因此:
from django.db.models import <b>Count</b>
Post.objects.annotate(
<b>number_of_liked=Count('liked_people')</b>
)
由此产生的 Post
个对象将有一个额外的属性 .number_of_liked
,其中包含相关 Liked
的数量。
您可以进一步过滤 Like
个对象,例如:
from django.db.models import <b>Count</b>
Post.objects.filter(
<b>liked_people__liked_people=<i>my_user</i></b>
).annotate(
number_of_liked=Count('liked_people')
)
这将排除 Post
个与 liked_people=my_user
没有相关 Like
个对象的对象。您也可以包括这些,但随后使用 .number_of_liked = 0
,使用:
from django.db.models import <b>Count, Q</b>
Post.objects.annotate(
number_of_liked=Count(
'liked_people'<b>,
filter=Q(liked_people__liked_people=<i>my_user</i>)</b>
)
)