Как правильно проверить в методе 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()
Вернуться на верх