Django:无法使用预取计算属性进行注释

标签 django orm relational-database

目标是对给定时间范围内每个员工的工作时间进行汇总和注释。

型号:

class Employee(models.Model):
    first_name = models.CharField(max_length=64)

class WorkTime(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name="work_times")

    work_start = models.DateTimeField()
    work_end = models.DateTimeField()
    work_delta = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        self.work_delta = (self.work_end - self.work_start).seconds
        super().save(*args, **kwargs)

获取给定日期范围内每个员工的工作时间:

queryset = Employee.objects.prefetch_related(
                Prefetch(
                    'work_times',
                    queryset=WorkTime.objects.filter(work_start__date__range=("2021-03-01", "2021-03-15"]))
                        .order_by("work_start"),
                    to_attr="filtered_work_times"
                )).all()

尝试为每个员工注释 work_delta 总和:

queryset.annotate(work_sum=Sum("filtered_work_times__work_delta"))

这会导致 FieldError:

Cannot resolve keyword 'filtered_work_times' into field. Choices are: first_name, id, work_times

从这里开始如何进行?顺便说一句,使用 Django 3.1。

最佳答案

您应该使用filtering on annotations 。 我没有尝试过,但我认为以下代码可能对您有帮助:

from django.db.models import Sum, Q

Employee.objects.annotate(
    work_sum=Sum(
        'work_times__work_delta',
        filter=Q(work_times__work_start__date__range=["2021-03-01", "2021-03-15"])
    )
)

关于Django:无法使用预取计算属性进行注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66626491/

相关文章:

mysql - 开源数据库的常见 SQL 查询列表?

mysql - 如何针对这种特定的数据信息正确设计SQL表呢?

python - Django/Python 中的自动增量字段

python - Django,如何模拟注释?

python - 即使在设置中配置,Django 也找不到我的模板目录?

php - 如何在 symfony 中检索一个 ID 之后的所有记录?

ios - 问题 - DBAccess ORM 使用 swift 声明 bool 类型创建表

database - 当产品差异很大时,设计产品数据库模式的最佳方法是什么?

python - 在 Windows 上使用 postman 命中 centos6 上存在的 django API

mysql - 如何在多列上创建索引