Использование декоратора свойств в 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.

Вернуться на верх