如何使用“可互换”字段设计模型?

时间:2010-08-15 01:33:01

标签: django django-models

对标题感到抱歉,我找不到合适的词。我会尽力描述它。

我有商家模型,需要一些属性。但商家属性取决于类别

例如,我在“餐厅”类别下有一个名为“XYZ”的企业,在“温泉”类别下有一个名为“ABC”的企业。我需要“XYZ”来拥有一组特定的属性;而“ABC”有一组不同的属性。此外,我需要能够组合类别,所以我不能为每个类别创建不同的模型。

我想在类别中设置一个“列表”,它会“激活”商家的相应字段。 Django有可能吗?或者我应该重新考虑一切吗?

3 个答案:

答案 0 :(得分:2)

Django通常(在大多数部署中)将模型映射到关系数据库中的表中,使您想要的架构很难实现。但是,有一个名为django-expando的项目提供了“可重用的Django应用程序,允许动态分配模型属性,类似于App Engine的内置expando类。”我不知道它有多好(它的readme确实提到了一些限制,例如所有字段都被“视为字符串状”,因为它“不存储类型” - 所以它更多一些比App Engine的内置Expando模型有限,但类似的东西似乎是实现所需架构的唯一方法。

答案 1 :(得分:0)

难道您不能仅将所有业务之间不常见的错误属性创建为可空字段吗?然后,任何属性不适用于任何特定类型的业务都是null。根据他们的需要,可能的业务类别只是不同的属性组合。

我可能没有完全理解你的问题,所以请随时纠正我。我也不能声称自己是一个经验丰富的django开发者,所以如果对你来说这听起来很愚蠢的话,请忽略所有这些。

答案 2 :(得分:0)

有两种选择可供选择。 这是我用于业务目录的一个,使用one2one关系我可以一次列出整个目录或只列出业务条目。这是模型的缩短版本

class Category(models.Model):
  name = models.CharField(max_length=12, unique=True)
  description = models.TextField()


class Subcategory(models.Model):
  category = models.ForeignKey(Category)
  name =  models.CharField(max_length=30, unique=True)


class Directory(models.Model):
  name = models.CharField(max_length=60)
  phone = models.CharField(max_length=15, blank=True)
  mobile = models.CharField(max_length=15, blank=True)
  etc.

class Business(Directory):
  directory = models.OneToOneField(Directory, parent_link=True, related_name="business_entries")
  cat = models.ForeignKey(Subcategory, limit_choices_to = {'category__exact': 2})
  more fields....

  def save(self):
    self.category='business'
    super(Business, self).save()

  def subcatname(self):
    return self.subcategory__name

  def full_category(self):
    return 'Business - '+self.subcategory__name


class Community(Directory):
  directory = models.OneToOneField(Directory, parent_link=True, related_name="community_entries")
  cat = models.ForeignKey(Subcategory, limit_choices_to = {'category__exact': 3})

class Tourism(Directory):
  directory = models.OneToOneField(Directory, parent_link=True, related_name="tourism_entries")
  cat = models.ForeignKey(Subcategory, limit_choices_to = {'category__exact': 4})

或者,您可以挑选自定义数据并将其放入文本字​​段中。然而,这不可搜索。