Создание коротких tinyurls для объектов модели Django с сохранением чистого кода - PullRequest
0 голосов
/ 03 июня 2011

Я использую этот код https://github.com/kylebragger/tiny/blob/master/tiny.py для преобразования целочисленных первичных ключей в сокращенные URL-адреса.

Например, вместо использования url / article / 1000 / title-of-article для id статьи 1000, URL-адрес может быть преобразован в /articles/a1b2c3/title-of-article.

Проблема с этим заключается в том, что мои модели и представления изобилуют вызовами функций, которые сокращают и сокращают эти первичные ключи.Они встречаются в каждом представлении, которое использует первичный ключ, а также методы в модели, которые возвращают постоянные ссылки, такие как get_absolute_url ().

Это кажется ненужным повторением.Мне было интересно, есть ли более элегантный способ сделать это без повсеместного вызова этих функций - возможно, путем изменения диспетчера URL и его обратной функции, чтобы автоматически вызывать указанную функцию обратного вызова, когда она встречает указанные параметры URL при генерации илипарсинг URL и выполнение этого обратного вызова для преобразования.

1 Ответ

1 голос
/ 03 июня 2011

Если вы сохраните сокращенный URL-адрес в базе данных как поле слагов , тогда вы можете использовать его как любое другое поле слагов и фильтровать его напрямую, без необходимости конвертировать его.

В качестве альтернативы: вы можете рассмотреть возможность создания собственного менеджера для любой модели, использующей этот метод, который позволяет вам искать записи в таблице, давая ей сокращенный URL-адрес.Пример:

MyModel.objects.get_by_short_url('myshorturl')

, который может быть реализован как:

class MyManager(models.Manager):
    ...
    def get_by_short_url(self, s):
        return self.get(from_tiny(s))

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

...