Создание заголовка / слага на основе идентификатора PK
Каков будет общий способ создать название записи и клуб на основе идентификатора? Я работаю с Джанго-фотологом здесь. Я хочу сохранить запись с заголовком и слагом на основе ПК. Общая проблема заключается в том, что я не могу получить PK, пока запись не будет сохранена в базе данных. С другой стороны, я не могу сохранить его без заголовка и пули.
Какое общее решение является такой проблемой?
3 ответа
Если вы должны выглядеть как URI "example.com/${obj.id}-${sluggify( obj.title )}"
затем генерировать эти URI, когда вы их используете. Этот URI не содержит данных, которых уже нет в БД, поэтому не добавляйте их снова. Единственная цель пули - сделать URL-адрес приятнее для людей и поисковых систем.
Возьмите Stackru в качестве примера: создание заголовка / слаг на основе идентификатора PK
Если вы хотите выбрать только слаг, это должен быть Первичный ключ, уникальный и неизменный. Вы должны знать, что имея другой ПК, обычный id
колонка, будет ненужной.
Я не говорю, что слизняки - это плохо, а спасение слизняков - это всегда плохо. Есть много веских причин, чтобы сохранить их в базе данных, но тогда вам нужно подумать о том, что вы делаете.
С другой стороны, выбор данных по их PK (и игнорирование пули) не требует размышлений, так что это должен быть путь по умолчанию.
Обычно вы вообще не используете первичный ключ. Если ваша задача состоит в том, чтобы просто автоматически генерировать уникальных слагов (это единственная причина, по которой я вижу, что вы пытаетесь сделать), то вам нужно AutoSlugField
, который создает уникальный слаг, увеличивая добавленное число на слаге, пока оно не станет уникальным.
Там есть реализация AutoSlugField
который является частью расширений django-command.
Чтобы назвать файл на основе идентификатора записи, у вас есть несколько вариантов:
а) Попробуйте предсказать ID:
max_pk = self.__class__.objects.aggregate(max_pk=Max('pk'))['max_pk'] or 0
predicted_id = max_pk+1
б) Переименовать файл в post_save, когда идентификатор известен.
Вы также можете использовать хэш md5 или случайные строки для генерации уникальных имен файлов.
Кстати, есть отдельное приложение django-autoslug.