2009-10-08 1 views
1

Каким будет общий способ создания названия записи и slub на основе идентификатора? Я работаю с django-photologue здесь. Я хочу сохранить запись с заголовком и slug на основе PK. Общая проблема заключается в том, что я не могу получить ПК до тех пор, пока запись не будет сохранена в базе данных. С другой стороны, я не могу сохранить его без названия и пули.Создание Title/Slug на основе PK ID

Какое общее решение состоит в том, что такая проблема?

ответ

1

Если вы URIs должны выглядеть как "example.com/${obj.id}-${sluggify(obj.title)}", тогда сгенерируйте эти uri при их использовании. Этот uri не содержит данных, которые еще не находятся в БД, поэтому не добавляйте их снова. Единственная цель slug - сделать внешний вид пользователя более приятным для людей и поисковых систем.

Возьмите Stackoverflow как пример: Creating Title/Slug based on PK ID

Если вы хотите выбрать только слизняк, он должен быть первичным ключом, уникальный и неизменен. Вы должны знать, что наличие другого ПК, обычного столбца id, будет ненужным.

Я не говорю, что слизняки плохие, и что спасательные слизняки всегда плохие. Есть много веских причин, чтобы сохранить их в базе данных, но тогда вам нужно думать о том, что вы делаете.

С другой стороны, выбор данных по PK (и игнорирование слизня) не требует мышления, поэтому это должен быть путь по умолчанию.

+0

+1 Я никогда не думал о пули таким образом. –

+1

Ваше сообщение просто говорит, что «слизняки плохие», когда на самом деле (по крайней мере ИМХО) слизняки имеют реальную ценность. Что делать, если вы не хотите показывать свои идентификаторы базы данных?Что, если вы думаете (как и я), что URL-адреса выглядят намного лучше, чем 'http: // example.com/entries/foo', чем' http: // example.com/entries/1238/foo'? В этот момент сохранение пулов в базе данных имеет значение. Они не денормализуют базу данных, поскольку они, как правило, связаны только с * начальным * заголовком и на самом деле не должны быть привязаны ни к чему. –

+0

Абсолютно не согласен с THC4k и согласен с Dominic. Slugs * do * имеют реальную ценность, и довольно неприятно делать то, что делает Stackoverflow, и использовать как (эффективно случайный) slug, так и ID в URL. ИМО, пули должны быть каноническим способом ссылки на страницу и поэтому не должны генерироваться динамически. –

1

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

Существует реализация AutoSlugField, которая является частью django-command-extensions.

+0

Это одно. Я хотел бы назвать файл на основе идентификатора записи. Я хотел бы иметь такие отношения для упрощения управления. Каково другое решение для создания уникальных имен файлов? – mdrozdziel

0

Назвать файл на основе Индентификационный у вас есть несколько вариантов:

а) попытаться предсказать ID:

max_pk = self.__class__.objects.aggregate(max_pk=Max('pk'))['max_pk'] or 0 
predicted_id = max_pk+1 

б) Переименовать файл в post_save, когда ID известно.

Вы также можете использовать хеш или случайные строки md5 для генерации уникальных имен файлов.

Btw, есть отдельно django-autoslug приложение.

+0

(a), вероятно, не очень хорошая идея, если ваше приложение будет иметь любую степень одновременной записи. (б) является опрятной идеей. –

+0

Я согласен, что (а) не так уж и велико. В геральном это можно считать быстрым взломом. Но если он используется как часть функции upload_to для FileField, тогда созданные дублированные имена файлов будут автоматически добавлены с помощью _ _ 'django, поэтому конфликтов имен не будет. Если вы обращаетесь к файлам обычным способом - используя путь, хранящийся в FileField, то проблем нет. Но согласитесь, в этом случае может быть сломан файл pk <->. –

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

  • Нет связанных вопросов^_^