Django OneToOne Field - PullRequest
       6

Django OneToOne Field

1 голос
/ 03 октября 2011

Сейчас я работаю с одним отображением URL. Допустим, у меня есть три класса, компания, пользователь и магазин, и моя цель состоит в том, чтобы их URL были в одной иерархии. Поскольку они имеют одинаковую иерархию в URL, я должен создать класс url_mapping, чтобы убедиться, что нет повторяющегося имени. Позвольте мне дать более конкретную проблему, которая у меня есть.

Class Company(models.Model):
    company_name  = models.CharField(max_length=30)
    url_mapping   = models.OneToOneField(URL_mapping)

Class User(models.Model):
    user_name  = models.CharField(max_length=30)
    url_mapping   = models.OneToOneField(URL_mapping)

Class store(models.Model):
    store_name  = models.CharField(max_length=30)
    url_mapping   = models.OneToOneField(URL_mapping)

Class URL_mapping(models.Model):
    url         = models.CharField(max_length=30)

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

Поскольку у пользователя, магазина и компании разные функции просмотра, возможно ли, что мы сможем быстро вернуться к соответствующей функции просмотра, используя обратный поиск? Или я должен добавить еще одно поле в URL_mapping, сообщающее, что это тип URL?

Пример:

http://www.example.com/levis       ->  will handle by brand_views
http://www.example.com/david       ->  will handle by user_views
http://www.example.com/mancy       ->  will handle by store_views

В базе данных у нас будет

url_mapping
id:1, name:levis
id:2, name:david
id:3, name:mancy

user
id:1, name:david, url_mapping:2

brand
id:1, name:levis, url_mapping:1

store
id:1, name: mancy, url_mapping:3

Где url_mapping - это oneToOneField.

Не знаю, как быстро отвести взгляд от класса url_mapping.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Я понимаю ваш вопрос как "У меня есть URL, и я хочу перейти в соответствующий магазин, компанию или пользователя".

Вы можете сделать это, используя

URL_mapping.objects.get(url).user
URL_mapping.objects.get(url).store
URL_mapping.objects.get(url).company

Очевидно, что 2 из них приведут к ошибке, и вы не будете знать, на что она отображается.

Мне кажется, что для того, что вы действительно ищете здесь, вы должны действительно использовать Generic Foreign Keys

Итак, тогда вы сможете сделать:

URL_mapping.objects.get(url)

, которая будет иметь соответствующую User, Company или Store модель.

1 голос
/ 03 октября 2011
  1. Я бы использовал SlugField в каждой модели (компания, пользователь, магазин) в качестве идентификатора.

  2. теоретически, вам не нужен URLТаблицы сопоставления вообще, в представлении, которое обрабатывает запросы, извлекают последнюю часть URL, которая является слагом, идентифицирующим Компанию, или Пользователя, или Магазин, и ищет Компанию, затем Пользователь, а затем Модели магазина дляслизнякОстановитесь, когда найдете объект.

  3. , чтобы повысить скорость, вы можете создать вспомогательную модель, как вы делали, и использовать соотношение GenericForeignKey, как предложил Лакшман Прасад.В этой вспомогательной модели, опять же, я бы использовал SlugField для идентификатора.И если вы используете это, вам не нужны слизни в ваших основных моделях.

  4. Лично я считаю, что это плохой дизайн.Во-первых, я сомневаюсь, что эти URL-адреса являются REST-FUL.Во-вторых, чтобы это работало, слагы в ваших основных моделях должны быть уникальными для этих трех моделей, что может быть обеспечено только внешним механизмом, здесь нельзя использовать ограничение UNIQUE.Ваша URL_mapping модель просто один из таких механизмов.Он в основном хранит ваши слагы для трех моделей вне моделей и, если вы добавите ограничение UNIQUE к SlugField в URL_mapping, убедитесь, что слагы уникальны для ваших основных моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...