Django - upload_to dynamici c путь от разных моделей - PullRequest
0 голосов
/ 10 апреля 2020

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

Book-title
    Chapter 1
        img1
        img2
    Chapter 2
        img1

Модели:

class Book(models.Model):
    title = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(max_length=250, unique=True)
    author = models.ManyToManyField(Author)
    chapter = models.ManyToManyField(Chapter, related_name='books')
def image_dir_path(instance, filename):
    chapter = instance.slug
    return os.path.join(chapter, filename)


class Chapter(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=130, unique=True)
    slug = models.SlugField(max_length=150, unique=True, blank=True)
    picture = models.ImageField(upload_to=image_dir_path)
    created_at = models.DateField(auto_now_add=True)

Я бы хотел что-то подобное , поэтому я могу использовать название книги для построения пути:

def image_dir_path(instance, filename):
    book = instance.book.slug
    chapter = instance.slug
    return os.path.join(book, chapter, filename)

Это не работает, экземпляр относится только к классу, в котором вы вызываете image_dir_path .

Это что-то подобное возможно?

1 Ответ

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

Обходной путь, который я нашел, заключается в том, чтобы вызвать Book в Chapter, установив отношения «OneToMany». ManyToMany не был нужен.

def image_dir_path(instance, filename):
    book = instance.book.slug
    chapter = instance.slug
    return os.path.join(book, chapter, filename)


class Chapter(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    book = models.ForeignKey(
            Book,
            related_name='chapters',
            on_delete=models.CASCADE,
            default=''
    )    
    title = models.CharField(max_length=130, unique=True)
    slug = models.SlugField(max_length=150, unique=True, blank=True)
    picture = models.ImageField(upload_to=image_dir_path)
    created_at = models.DateField(auto_now_add=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...