Я создаю приложение, в котором хочу, чтобы изображения были доступны через хэш-строку (чтобы люди не догадывались/не получали доступ к другим фотографиям). Для этого я использую следующий подход:Когда создаются идентификаторы модели django?
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'), но приведенный выше код работает, и функция сохранения называется первым, когда я на самом деле вызываю сохранение объекта. Например: 'a = PhotoModel()' 'a.save()' Ошибка 'save', поскольку требуемые поля отсутствуют, а' id' становится пустым и объект не сохраняется в базе данных. Но поле slg было заселено! – sudshekhar
Является ли ваша модель именно такой, которую вы разместили? Поскольку это поведение, как я уже говорил, определенно, и я считаю крайне маловероятным, чтобы эта часть рамки django была глючной. – e4c5
Хорошо, теперь я чувствую себя полным идиотом: P. Моя модель такая же, как я описал выше, но, оказывается, моя хэш-функция несет ответственность за эту путаницу. Поведение работало так, как описано просто потому, что моя хеш-функция сгенерировала пул с использованием 'None' в качестве ввода, и поэтому я увидел генерируемое значение. Обнаружил это, добавив в функцию простой оператор печати. Извините за беспорядок! – sudshekhar