Django OneToOne Field

时间:2011-10-03 00:47:20

标签: python django 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_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类快速查找。

谢谢。

2 个答案:

答案 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)

将包含相应的UserCompanyStore模型。

答案 1 :(得分:1)

  1. 我会在每个模型(公司,用户,商店)中使用SlugField作为标识符。

  2. 理论上,您根本不需要任何URL映射表,在处理请求的视图中,提取URL的最后一部分,这是标识公司,用户或商店的slug ,然后搜索公司,然后搜索用户,然后搜索给定slug的模型。找到对象时停止。

  3. 为了提高速度,你可以像你一样创建一个辅助模型,并使用GenericForeignKey关系作为Lakshman Prasad的建议。在这个辅助模型中,我再次使用SlugField作为标识符。如果你使用它,你的主模型中不需要slu ..

  4. 我个人认为这是一个糟糕的设计。首先,我怀疑这些URL是否完整。其次,为了实现这一点,主模型中的模块必须在这三个模型中是唯一的,只能通过外部机制来确保,您不能在此处使用UNIQUE约束。您的URL_mapping模型只是一种这样的机制。它基本上存储模型外的三个模型的slug,如果你将UNIQUE约束添加到SlugField中的URL_mapping,则确保slug在主模型中是唯一的。< / p>