【发布时间】:2021-08-26 14:55:26
【问题描述】:
我有一个 Book 的 Django 模型,它有一个 slug 字段,该字段是基于其 pk 的哈希值。它还有一个thumbnail,它被保存到包含slug的路径中。
在管理员中,如果我在没有缩略图的情况下创建并保存图书,然后然后添加缩略图并再次保存图书,这样可以:缩略图保存到 /media/books/<slug>/foo.jpg。
但是,如果我使用缩略图创建书,并保存它,缩略图会在slug 生成之前保存,因此它会保存到/media/books/foo.jpg。这是因为文件是在模型之前保存的。
我想总是在缩略图的路径中包含slug,但我不知道如何延迟保存缩略图,直到生成slug。有什么想法吗?
from django.db import models
from hashes import Hashids
def upload_path(instance, filename):
return "/".join([books, instance.slug, filename])
class Book(models.Model):
title = models.CharField(null=False, blank=False, max_length=255)
slug = models.SlugField(max_length=10, null=False, blank=True)
thumbnail = models.ImageField(
upload_to=upload_path, null=False, blank=True, default=""
)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if not self.slug:
# Now we have a pk, generate a slug if it doesn't have one.
hashids = Hashids(salt="my salt", min_length=5)
self.slug = hashids.encode(self.pk)
kwargs["force_insert"] = False
self.save(*args, **kwargs)
(我知道哈希不安全;有人可以从slug 中找出pk。对于这个用例我很好。)
【问题讨论】:
标签: django django-models