现在我正在使用一个网址映射。假设我有三个类,公司,用户和商店,我的目标是他们的网址将在同一层次结构中。由于它们在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_mapping类中的网址,然后执行反向查找,查看公司,用户和商店之间的网址类型。
由于User,Store和Company具有不同的视图功能,我们是否可以使用反向查找快速直接重定向到相应的视图功能?或者我应该在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类快速查找。
谢谢。
答案 0 :(得分:3)
我理解您的问题是“我有一个网址,我想去相应的商店,公司或用户”。
您可以使用
执行此操作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 :(得分:1)
我会在每个模型(公司,用户,商店)中使用SlugField
作为标识符。
理论上,您根本不需要任何URL映射表,在处理请求的视图中,提取URL的最后一部分,这是标识公司,用户或商店的slug ,然后搜索公司,然后搜索用户,然后搜索给定slug的模型。找到对象时停止。
为了提高速度,你可以像你一样创建一个辅助模型,并使用GenericForeignKey
关系作为Lakshman Prasad的建议。在这个辅助模型中,我再次使用SlugField
作为标识符。如果你使用它,你的主模型中不需要slu ..
我个人认为这是一个糟糕的设计。首先,我怀疑这些URL是否完整。其次,为了实现这一点,主模型中的模块必须在这三个模型中是唯一的,只能通过外部机制来确保,您不能在此处使用UNIQUE
约束。您的URL_mapping
模型只是一种这样的机制。它基本上存储模型外的三个模型的slug,如果你将UNIQUE
约束添加到SlugField
中的URL_mapping
,则确保slug在主模型中是唯一的。< / p>