Использование декоратора свойств в Django для вычисления суммы
У меня есть две формы, в которых одна модель состоит из поля file. Мне нужно вычислить общий размер файлов в родительской модели в декораторе свойств. Я думаю, что это можно сделать и внутри класса сериализатора, используя метод сериализатора, но я хочу внутри декоратора свойств.
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(…) клаузе [Django-doc] или любом другом выражении queryset: они делаются на стороне базы данных , а база данных ничего не знает о свойствах, моделях или Python.
Более того, мы не можем преобразовать это выражение в то, что может понять queryset, поскольку FileField хранит только путь к файлу, а не его размер.
Таким образом, вам придется вручную определить размер, например, с помощью:
class Package(models.Model):
# …
@property
def folder_size(self):
return sum(detail.file_size for detail in self.details.only('file'))
здесь .only(…) предложение [Django-doc] может ограничить пропускную способность, извлекая только file столбец, но все равно обработка должна быть выполнена на уровне Python/Django.