#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:
-
Я бы использовал a
SlugField
в каждой модели (Company, User, Store) в качестве их идентификатора. -
теоретически вам вообще не нужны какие-либо таблицы сопоставления URL-адресов, в представлении, которое обрабатывает запросы, извлеките последнюю часть URL-адреса, которая представляет собой слаг, идентифицирующий компанию, или пользователя, или магазин, и найдите компанию, затем пользователя, а затем модели хранения для данного слага. Остановитесь, когда найдете объект.
-
чтобы повысить скорость, вы можете создать вспомогательную модель, как вы это сделали, и использовать
GenericForeignKey
отношение, как предложил Лакшман Прасад. В этой вспомогательной модели, опять же, я бы использовал aSlugField
для идентификатора. И если вы используете это, вам не нужны пули в ваших основных моделях. -
Я лично считаю, что это плохой дизайн. Во-первых, я сомневаюсь, что эти URL-адреса являются REST-ful. Во-вторых, чтобы это работало, слаги в ваших основных моделях должны быть уникальными для этих трех моделей, что может быть обеспечено только внешним механизмом, вы не можете использовать
UNIQUE
ограничение здесь. ВашаURL_mapping
модель — просто один из таких механизмов. В основном он хранит ваши пули для трех моделей вне моделей и, если вы добавитеUNIQUE
ограничение вSlugField
inURL_mapping
, гарантирует, что пули уникальны для ваших основных моделей.