Как отправить данные из поля @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)