Миграция 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, так что этого документа достаточно.