Миграция FileField / ImageField не применяется

Я буду очень признателен, если кто-нибудь поможет мне с этой ошибкой Django, мои модели созданы следующим образом :

from django.db import models
from django.utils.timezone import now

# Create your models here.


class Album(models.Model):
    album_title = models.CharField(max_length=200)
    creation_date = models.DateTimeField(default=now)

    def __str__(self):
        return self.album_title


class Photo(models.Model):
    name = models.CharField(max_length=300, default="")
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    # file = models.ImageField(upload_to=Album.album_title, null=True, blank=True)
    description = models.CharField(max_length=1000, default="")
    file_url = models.CharField(max_length=1000)
    selected = models.BooleanField(default=False)
    date_uploaded = models.DateTimeField(default=now)
    file_type = models.Choices('Raw', 'JPEG')

    def __str__(self):
        return str(self.album) + "ID.{:0>3}".format(self.id)

Если я делаю миграции таким образом, все работает нормально, но всякий раз, когда я откомментировал строку :

file = models.ImageField(upload_to=Album.album_title, null=True, blank=True) в моем классе Фото, я не могу делать миграции.

Когда я запускаю код python3 manage.py make migrations, у меня есть такой след стека :

Я перешел по этой ссылке https://docs.djangoproject.com/en/3.2/topics/migrations/#migration-serializing, чтобы посмотреть, что там написано, но я не смог найти что-то понятное (на моем уровне) для решения проблемы. Проблема в том, что в предыдущем проекте, когда я хотел добавить изображения, Django попросил меня установить Pillow, и после того, как я это сделал, мой код заработал. Я мог делать миграции, но теперь - ничего. В качестве базы данных я использую Postgres.

Спасибо вам, ребята, за помощь. (P.S: Я начинающий в изучении Django)

Здесь проблема в ImageField, у него есть поле upload_to, которое должно быть именем пути, оно не может указывать на класс Album, экземпляр которого еще не создан. Если ваш Photo должен быть сохранен на основе поля album, то я полагаю, что, увидев строку кода file = models.ImageField(upload_to=Album.album_title, null=True, blank=True) и строку album = models.ForeignKey(Album, on_delete=models.CASCADE), я считаю, что вы хотите сохранить file на основе album, на которое вы указываете.

вы можете попробовать что-то вроде этого

def get_path(instance, filename):
    return '{0}/{1}'.format(instance.file.album_title, filename)

и ваш код в строке file должен выглядеть как

file = models.ImageField(upload_to=get_path, null=True, blank=True)


что вы делаете здесь, так это определяете функцию, которая обеспечивает динамическую установку пути на основе ваших входных данных. внутри функции get_upload_path вы можете вносить изменения в структуру пути по своему усмотрению.

Для получения более подробной информации вы можете обратиться к этому документу https://docs.djangoproject.com/en/3.2/ref/models/fields/#django.db.models.FileField.upload_to

Imagefield наследуется от FileField в моделях django, так что этого документа достаточно.

Вернуться на верх