【问题标题】:How to get count value of a ManyToManyField?如何获取 ManyToManyField 的计数值?
【发布时间】:2021-07-22 11:06:37
【问题描述】:

我有一个带有 ManyToManyField 字段“用户”的模型帖子:

class Post(models.Model):
STATIC_CHOICES = (
    ('draft', 'Draft'),
    ('published', 'Published')
)


title = models.CharField(max_length = 255)
slug = models.SlugField(max_length = 255)
author = models.ForeignKey(User, related_name = 'blog_posts', on_delete = models.CASCADE)
body = models.TextField()

likes = models.ManyToManyField(User, related_name = 'likes', blank = True)
upvotes = models.IntegerField(default = 0)
created = models.DateTimeField(auto_now_add = True)
status = models.CharField(max_length = 10, choices = STATIC_CHOICES, default = 'draft')

def __str__(self):
    return self.title

def total_likes(self):
    return self.likes.count()

def get_absolute_url(self):
    return reverse("post_detail", args=[self.id, self.slug])

我了解total_likes()方法返回视图中的点赞数。但是,我想在upvotesIntegerField 的默认值中显示点赞数。基本上,如果我可以这样做:

upvotes = models.IntegerField(default = total_likes())

这样,喜欢的数量就会在管理员的 IntegerField 中显示为默认值。但是,既然我不能这样做,那么最好的方法是什么让我可以让likes 的数量出现在upvotes 的 IntegerField 中?

【问题讨论】:

    标签: python django django-models properties


    【解决方案1】:

    您可以.annotate(…) [Django-doc]QuerySetPosts 与喜欢的数量:

    from django.db.models import Count
    
    Post.objects.annotate(
        total_likes=Count('likes')
    )

    由此QuerySet 产生的Post 对象将有一个额外的属性.total_likes 与喜欢的数量。

    因此,您不需要存储赞成票的数量。这通常会更好,因为这样可以避免数据重复

    【讨论】:

    • 这是否显示在 IntegerField 中?我希望可以选择编辑喜欢的值。
    • @WannaInternet:不,这是每次由数据库决定的。通过将其设置为字段,最终可能会导致喜欢的数量不同步,因为例如用户被删除,或者bulk_create/bulk_update 绕过触发器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2019-06-10
    • 2013-06-11
    • 2016-08-03
    相关资源
    最近更新 更多