2016-05-13 4 views
1

Я создаю приложение, в котором хочу, чтобы изображения были доступны через хэш-строку (чтобы люди не догадывались/не получали доступ к другим фотографиям). Для этого я использую следующий подход:Когда создаются идентификаторы модели 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-адреса для объекта? (я добавлю соль к функции хэширования для дополнительной безопасности позже)

ответ

0

Если поле id является полем автоматического приращения, идентификатор фактически генерируется базой данных. Он возвращается Джанго механизмов, имеющимися в базе данных, например, в MySQL это может быть LAST_INSERT_ID()

Если переопределить метод сохранения в модели, как вы сделали, то идентификатор будет неопределенным, прежде чем делать super(PhotoModel, self).save(*args, **kwargs) но будут определены позже.

Другой способ генерации идентификаторов - использовать поля . В этом случае django генерирует идентификатор с вызовом uuid.uuid4

Поля UUID недоступны, и если у вас в вашем первичном ключе было поле uuid, вам не понадобится поле вашего пули, но есть и другие недостатки использования UUID. Плюсы и минусы UUID широко обсуждаются в другом месте в stackoverflow, и я не думаю, что мне нужно обсудить дальше.

Что касается вопроса «это правильный способ создания неопознанного URL-адреса для объекта?» На этот вопрос нельзя ответить должным образом, не глядя на вашу хэш-функцию. И это действительно должно быть опубликовано в отдельном вопросе.

+0

У меня было то же понимание, что и вы упомянули прямо сейчас (относительно 'id'), но приведенный выше код работает, и функция сохранения называется первым, когда я на самом деле вызываю сохранение объекта. Например: 'a = PhotoModel()' 'a.save()' Ошибка 'save', поскольку требуемые поля отсутствуют, а' id' становится пустым и объект не сохраняется в базе данных. Но поле slg было заселено! – sudshekhar

+0

Является ли ваша модель именно такой, которую вы разместили? Поскольку это поведение, как я уже говорил, определенно, и я считаю крайне маловероятным, чтобы эта часть рамки django была глючной. – e4c5

+0

Хорошо, теперь я чувствую себя полным идиотом: P. Моя модель такая же, как я описал выше, но, оказывается, моя хэш-функция несет ответственность за эту путаницу. Поведение работало так, как описано просто потому, что моя хеш-функция сгенерировала пул с использованием 'None' в качестве ввода, и поэтому я увидел генерируемое значение. Обнаружил это, добавив в функцию простой оператор печати. Извините за беспорядок! – sudshekhar

Смежные вопросы