对标题感到抱歉,我找不到合适的词。我会尽力描述它。
我有商家模型,需要一些属性。但商家的属性取决于类别。
例如,我在“餐厅”类别下有一个名为“XYZ”的企业,在“温泉”类别下有一个名为“ABC”的企业。我需要“XYZ”来拥有一组特定的属性;而“ABC”有一组不同的属性。此外,我需要能够组合类别,所以我不能为每个类别创建不同的模型。
我想在类别中设置一个“列表”,它会“激活”商家的相应字段。 Django有可能吗?或者我应该重新考虑一切吗?
答案 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})
或者,您可以挑选自定义数据并将其放入文本字段中。然而,这不可搜索。