如何在 Django 中计算数据库 Table 的所有对象?

How to Count All Objects of a Database Table in Django?

我有一个模型如下,我想用 Django 2.0.4 在 Table Work 中过滤一个 user's all work_times,在此先感谢您的任何建议。

class Work(models.Model):
    name = models.CharField(max_length=800)
    date = models.DateField(auto_now=False, null=True, blank=True)
    time = models.TimeField(auto_now=False, null=True, blank=True)
    work_times = models.FloatField(default=1, verbose_name="work times(hours)")
    user = models.ManyToManyField(User, related_name="works", blank=True)

您可以通过以下方式获得所有这些:

all_work = Work.objects.filter(user=sample_user)

如果您想知道该查询中的行数,您可以使用:

all_work_count = Work.objects.filter(user=sample_user).count()

您可以通过以下方式访问该查询的每个项目:

for each_work in all_work:
    print(each_work.work_times)

编辑

通过获取用户的所有作品,您可以从作品实例访问个人work_time。但是,您也可以通过这种方式访问​​ work_time:

all_work = Work.objects.filter(user=sample_user).values('work_times')

这只会给你 work_times。但是这样一来,你就无法知道work_time属于哪个作品了。

编辑 2
要获得总工作时间,您有两个选择,一个简单,一个稍微复杂一些:

简单

这是技术上简单的解决方案,但仅适用于非常小的查询大小。
all_works = Work.objects.filter(user=sample_user)
total_work = 0
for work in all_works:
    total_work += work.work_times

复一

虽然这个效率更高并且在一行中,但您可能需要稍微尝试一下才能正确使用它。

from django.db.models import Sum

total_works = Work.objects.filter(user=sample_user).aggregate(Sum("work_times"))

如果您只想包括 work_times 不同于 1...

的那些,您可以这样计算它们
count = User.objects.filter(work__gt=1).count()

或者这种方式也包括那些 work_times 等于 1...

count = User.objects.filter(work__gt=1).count()

并从所有具有用户的工作对象中获取查询集...

all_works = Work.objects.filter(user__isnull=False)

您也可以通过添加 .count() 来从上次查询中计算它们。

count=User.objects.filter(用户名='username').first().work_set.all().count()