Django: изменить поле модели перед сохранением - PullRequest
1 голос
/ 11 апреля 2020

У меня есть модель, курс , с ImageField и FileField, поэтому я хотел бы создавать папку каждый раз, когда пользователь создает курс. Я думаю, что смогу сделать это до того, как модель будет сохранена, поэтому вот мой вопрос.

Как получить доступ к полям модели в методе?

Models.py

Class Course(models.Model):
 Thumbnail = model.ImageField(upload_to=“...”,...)

    def save(self, *args, **kwargd):
        ... #How can I alter here the ImageField parameters?
          super().save(*args, **kwargs)

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

Экземпляр поля моделей можно получить, используя self, как обычную переменную экземпляра.

Например, в приведенном ниже классе модели,

class DummyModel(models.Model):
    key = models.CharField()
    value = models.TextField()

    def save(self, *args, **kwargs):
        value = self.value # self.value is a model field.
        super().save(*args, **kwargs)

В вашем случае вы можете получить к нему доступ используя self.Thumbnail

1 голос
/ 11 апреля 2020

См. здесь о получении полей модели.

Чтобы получить поле экземпляра объекта, оно должно быть просто как

def save(self, *args, **kwargd):
     ... #How can I alter here the ImageField parameters?
     self.Thumbnail = #do whatever you want here
     super().save(*args, **kwargs)

Невозможно изменить параметры поля в методе. Это должно быть сделано только в определениях полей, потому что модель должна быть сохранена первой

0 голосов
/ 11 апреля 2020

Поскольку невозможно изменить параметры поля модели перед его созданием, как сказал @ azyCrw4282 в своем ответе, можно создать каталог с именем экземпляра модели и загрузить туда файлы, анализирующие функцию, до upload_to

models.py

def upload_to(instance, filename):
    return 'user_course/{0}/{1}'.format(instance.name, filename) #instance.name will be the name of the course


class Course(models.Model):
    name       = model.CharField(...)
    thumbnail  = models.ImageField(upload_to=upload_to, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...