【问题标题】:Django OneToOne FieldDjango OneToOne 字段
【发布时间】:2011-10-03 00:47:20
【问题描述】:

现在我正在处理一个 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_mapping 类中匹配该 url,然后进行反向查找,看看公司、用户和商店之间的 url 类型。

既然User、Store、Company有不同的view函数,是否可以通过反向查找快速重定向到对应的view函数?或者我应该在 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 类中快速查找。

谢谢。

【问题讨论】:

  • 您能解释一下 url 层次结构和三个类位于同一层次结构中的含义吗?这对我来说看起来很复杂。 :)
  • 嗨,我现在用一个例子来解释我的问题。谢谢。

标签: python django url


【解决方案1】:

我将您的问题理解为“我有一个 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)

这将具有相应的UserCompanyStore 模型。

【讨论】:

    【解决方案2】:
    1. 我会在每个模型(公司、用户、商店)中使用 SlugField 作为它们的标识符。

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

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

    4. 我个人认为这是一个糟糕的设计。首先,我怀疑这些 URL 是否支持 REST。其次,为此,您的主要模型中的 slug 在这三个模型中必须是唯一的,这只能通过外部机制来确保,您不能在此处使用 UNIQUE 约束。您的URL_mapping 模型就是这样一种机制。它基本上将三个模型的 slug 存储在模型之外,如果您将 UNIQUE 约束添加到 URL_mapping 中的 SlugField,请确保这些 slug 在您的主要模型中是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2012-05-25
      • 2015-03-16
      • 2014-12-28
      • 2016-06-10
      • 1970-01-01
      • 2016-01-08
      相关资源
      最近更新 更多