Django 模型 ID 何时生成?

When are django model id's generated?

我正在创建一个应用程序,我希望可以通过哈希字符串访问图片(以防止人们 guessing/accessing 其他照片)。为此,我使用以下方法:

class PhotoModel(models.Model):
    name = models.CharField(max_length=256)
    slg = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.slg:
            self.slg = slugify(my_own_hash_function(str(self.id)))
        super(PhotoModel, self).save(*args, **kwargs)

该方法有效,但我不明白为什么。在django模型中什么时候生成'id'?这是为对象创建不可猜测的 url 的正确方法吗? (稍后我会在散列函数中加盐以增加安全性)

如果id字段是自增字段,则ID实际是由数据库生成的。它通过数据库中可用的机制返回给 django,例如 mysql 这可能是 LAST_INSERT_ID()

如果您像您一样重写模型中的保存方法,那么在您这样做之前 id 将是未定义的 super(PhotoModel, self).save(*args, **kwargs) 但它会在之后定义。

另一种生成 ID 的方法是使用 UUID 字段。在这种情况下,django 通过调用 uuid.uuid4

生成 id

UUID 字段是不可猜测的,如果你有一个 uuid 字段作为你的主键,你就不需要你的 slug 字段,但是使用 UUID 还有其他缺点。 UUID 的优点和缺点在 Whosebug 的其他地方被广泛讨论,我认为我不需要进一步讨论。

至于问题"is this the right way to create an unguessable url for an object?"这个问题不看你的散列函数是无法正确回答的。无论如何,这真的应该发布在一个单独的问题中。