在 Django 中使用 属性 装饰器来计算 Sum

use of property decorator in Django to calculate Sum

我有两个模型,其中一个模型由文件字段组成。我必须计算 属性 装饰器中父模型中文件的总大小。我认为这也可以在序列化器 class 中使用序列化器方法完成,但我想在 属性 装饰器中完成。

class Package(models.Model):   

    name = models.CharField(max_length=50,blank=True)
    />....................other fields.........../

    **/.........problem is here..../**
    @property
    def folder_size(self):
        all = self.details.all()
        
        all.annotate()
        return total

这里我需要帮助来计算单个包的所有文件大小的总和。

Class Details(models.Model):
    package = models.ForeignKey(Package, on_delete=models.CASCADE,null=True,
                               related_name='details')
    notes = models.FileField(blank=True, null=True)

    @property
    def file_size(self):
        return self.file.size

您不能在 .annotate(…) clause [Django-doc] 或任何其他查询集表达式中使用属性:这些是在 数据库 端完成的,数据库对属性一无所知,型号,或 Python.

此外,我们无法将此表达式转换为查询集可以理解的内容,因为 FileField 仅存储文件的路径,而不存储其大小。

因此您需要手动确定尺寸,例如:

class Package(models.Model):
    # …
    
    @property
    def folder_size(self):
        return sum(detail.file_size for detail in self.details.only('file'))

这里.only(…) clause [Django-doc]可以通过只获取file列来限制带宽,但仍然必须在Python/Django级别进行处理。