Поле Django OneToOne

#python #django #url

#python #django #url

Вопрос:

Сейчас я работаю с одним сопоставлением URL. Допустим, у меня есть три класса: company, user и store, и моя цель состоит в том, чтобы их 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 сейчас.

Спасибо.

Комментарии:

1. не могли бы вы объяснить, что вы подразумеваете под иерархией url и тремя классами, находящимися в одной иерархии? для меня это выглядит очень запутанным. 🙂

2. Привет, сейчас я объясняю свою проблему на примере. Спасибо.

Ответ №1:

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

Вы можете сделать это с помощью

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

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

Мне кажется, для того, что вы действительно ищете здесь, вам действительно следует использовать общие внешние ключи

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

 URL_mapping.objects.get(url)
  

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

Ответ №2:

  1. Я бы использовал a SlugField в каждой модели (Company, User, Store) в качестве их идентификатора.

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

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

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