Как правильно проверить в методе save() модели, было ли зафиксировано поле FileField в Django?
В Django, если вы переопределяете save
метод модели с помощью FileField
, вы можете сделать что-то вроде этого:
class MyModel(models.Model):
my_file = models.FileField()
def save(self, *args, **kwargs):
if self.my_file and not self.my_file._committed:
# The file changed
Это позволяет обнаружить любой момент загрузки нового файла. Это может произойти, если создается новый экземпляр MyModel
или изменяется один, а новый файл заменяет старый файл (или файл отсутствует).
Это очень удобно для случаев, когда вам нужно прочитать файл и что-то сделать, но только если файл изменился.
Это работает, но небольшая проблема в том, что атрибут my_file._committed
начинается с подчеркивания, что указывает на то, что он не предназначен для использования вне класса, в котором он определен.
Существует ли способ определить, изменился ли файл в FileField
во время текущей операции save()
без использования атрибута private _.committed
?
Возможно, вы можете проверить self.my_file.instance.attname
экземпляр.
Из Django
исходного кода FileField.save
метода :
def save(self, name, content, save=True):
name = self.field.generate_filename(self.instance, name)
self.name = self.storage.save(name, content, max_length=self.field.max_length)
setattr(self.instance, self.field.attname, self.name) # <- check the attribute
self._committed = True
# Save the object because it has changed, unless save is False
if save:
self.instance.save()