在 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级别进行处理。
我有两个模型,其中一个模型由文件字段组成。我必须计算 属性 装饰器中父模型中文件的总大小。我认为这也可以在序列化器 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级别进行处理。