Как отправить данные из поля @property в таблицы базы данных в Django

У меня есть DocumentModel, содержащая некоторые поля, включая document, которое является полем file. Я использовал декоратор @property для получения имени, размера и типа mime файла, который загружается.

Проблема, с которой я столкнулся, заключается в том, что поля @property отображаются на фронтенде в сериализаторах, но они не отображаются в таблицах базы данных.

В таблицах базы данных отображаются только id, document и created_at, но не filename, filesize и mimetype

Любезно, если кто-нибудь может подсказать, как я могу отправить эти данные @property в таблицы базы данных?

Models.py

class DocumentModel(models.Model):
    id=models.AutoField(primary_key=True, auto_created=True, verbose_name="DOCUMENT_ID")
    document=models.FileField(max_length=350 ,validators=  [FileExtensionValidator(extensions)])
    created_at=models.DateTimeField(auto_now_add=True)
    

    class Meta:
        verbose_name_plural="Documents"
        ordering=["document"]

    def __str__(self):
        return f'{self.document}'
    @property
    def filename(self):
        return self.document.name

   

    @property
    def mimetype(self):
        return mimetypes.guess_type(self.document.url)[0]

serializers.py

class DocumentSerializer(serializers.ModelSerializer):

    
            
        

    class Meta:
        model=DocumentModel
        fields = ['id', 'document', 'filesize', 'filename', 'mimetype', 'created_at']

Вы можете просто создать поля в вашей модели вместо свойств. Они будут сопоставлены с базой данных. Однако не уверен, что это хорошая идея. Вам нужно будет очень тщательно следить за целостностью данных при изменении файлов. Если вы абсолютно уверены, что это то, что вам нужно, вы можете, например, переопределить метод save для автоматической генерации значений полей filename и mimetype перед сохранением в базе данных. Следует помнить, что метод save вызывается НЕ при вызове .objects.update, например.

Можно было бы сделать что-то вроде этого:

class DocumentModel(models.Model):
    id = models.AutoField(primary_key=True, auto_created=True, verbose_name="DOCUMENT_ID")
    document = models.FileField(max_length=350 ,validators=  [FileExtensionValidator(extensions)])
    created_at = models.DateTimeField(auto_now_add=True)
    filename = models.CharField(...)
    mimetype = models.CharField(...)

    def save(self, force_insert=False, force_update=False, *args, **kwargs):
        self.filename = self.document.name
        self.mimetype = mimetypes.guess_type(self.document.url)[0]
        super().save(force_insert, force_update, *args, **kwargs)
Вернуться на верх