数据库和 class 设计 Django
Database and class design Django
我正在用 django 建立一个销售自行车的网站。我有一辆 class 自行车,里面装有自行车;它看起来像这样:
class Bike(models.Model):
brand = models.CharField(max_length=100)
model = models.CharField(max_length=100)
现在我想添加一个 wheels 字段来描述自行车的车轮,我希望这个字段可能包含几个字段,比如车轮的品牌、尺寸。我希望将这些关于车轮实施的细节与自行车的 class 规格分开;但是,我希望每个轮子都与一辆自行车相关联。
我的一个想法是执行以下操作:
class Wheels(models.Model):
description = models.CharField(max_length=100)
size = models.DecimalField(max_digits=5,decimal_places=2)
然后在我的自行车中加入一个新领域:
class Bike(models.Model):
# previous fields
wheels = models.ForeignKey(Wheels)
不过我对此有一些疑问:
1) 设计是否正确?如果我这样做,我最终会得到一个我认为我实际上不需要的轮子数据库。我只想在我的自行车数据库中有灵活的字段。
基本上我希望自行车和车轮之间存在一对一的关系。
2) 如果这是正确的设计,那么我想要的是能够在添加自行车的同时动态添加轮子(永远不必单独添加轮子)。最好的方法是什么?
非常感谢任何提示/参考。我是 django 的初学者...
我怀疑(在现实生活中)你真的会在自行车和车轮之间建立一对一的关系 - 不止一种自行车型号肯定会使用相同的车轮。
自行车 brands/models 和变速器、刹车、曲柄、踏板等部件之间存在类似的现实生活关系
顺便说一句,您不会为每个组件创建单独的 数据库 ,每个组件将被建模为 table 在同一个数据库中。
所以我的建议是采用多种 table 方法,因为您最终会在不同的自行车上使用相同的组件,反之亦然,因为在相同的基本自行车型号中有可选组件,例如相同的自行车,但车轮尺寸不同。
我觉得这个设计不错 - 将单个对象放在单独的表中是个好主意(在这种情况下,构成自行车的部件 - 特别是因为它们可以单独出售,而且自行车可以用不同的部件定制)
我认为继承自 Bicycle class 的简单预设 class 应该可以解决问题:
class BicycleFrame(models.Model):
brand = models.ForeignKey(Brand)
model = models.CharField(max_length=100)
# class BicycleWheels, BicyclePedals etc..
class Bicycle(models.Model):
frame = models.ForeignKey(BicycleFrame)
wheels = models.ForeignKey(BicycleWheels)
pedals = models.ForeignKey(BicyclePedals)
# etc ...
class PresetBicycle(Bicycle):
pass
class PurchaseableMixin(models.Model):
user_id = models.ForeignKey(Customer)
def purchase(self):
# ... call this in the form handler to save this
# instance of a bike in the database and maybe
# email the customer to inform them of their purchase etc..
class Meta:
abstract = True
class PurchasedBicycle(Bicycle, PurchaseableMixin):
pass
.. 然后您可以在您的管理区域中创建一个 PresetBicycle 然后在您向客户展示的视图中您可以默认显示 PresetBicycle 并提供一个购买它的表格,该表格会自动填写详细信息PresetBicycle 并在提交时创建 PurchasedBicycle 的实例(像 ReactJS 和 Backbone 或 Angular 这样的 JS 框架可能最适合客户视图)。
希望对您有所帮助!
P.S。请注意,我自己还没有测试过这种方法——我建议在版本控制中创建几个新分支(例如 git)并为每个分支设置单独的设置文件(从基本设置文件导入并使用每个人都有一个单独的数据库,这样就不必搞乱太多的迁移和过时的表)在做出最终决定之前测试几种方法——最好尽早弄清楚这些东西,这样你就不会最终做出大的结构稍后更改。
P.P.S 也不是我将品牌字段更改为外键,因为您稍后可能希望过滤品牌..
我正在用 django 建立一个销售自行车的网站。我有一辆 class 自行车,里面装有自行车;它看起来像这样:
class Bike(models.Model):
brand = models.CharField(max_length=100)
model = models.CharField(max_length=100)
现在我想添加一个 wheels 字段来描述自行车的车轮,我希望这个字段可能包含几个字段,比如车轮的品牌、尺寸。我希望将这些关于车轮实施的细节与自行车的 class 规格分开;但是,我希望每个轮子都与一辆自行车相关联。
我的一个想法是执行以下操作:
class Wheels(models.Model):
description = models.CharField(max_length=100)
size = models.DecimalField(max_digits=5,decimal_places=2)
然后在我的自行车中加入一个新领域:
class Bike(models.Model):
# previous fields
wheels = models.ForeignKey(Wheels)
不过我对此有一些疑问:
1) 设计是否正确?如果我这样做,我最终会得到一个我认为我实际上不需要的轮子数据库。我只想在我的自行车数据库中有灵活的字段。 基本上我希望自行车和车轮之间存在一对一的关系。
2) 如果这是正确的设计,那么我想要的是能够在添加自行车的同时动态添加轮子(永远不必单独添加轮子)。最好的方法是什么?
非常感谢任何提示/参考。我是 django 的初学者...
我怀疑(在现实生活中)你真的会在自行车和车轮之间建立一对一的关系 - 不止一种自行车型号肯定会使用相同的车轮。
自行车 brands/models 和变速器、刹车、曲柄、踏板等部件之间存在类似的现实生活关系
顺便说一句,您不会为每个组件创建单独的 数据库 ,每个组件将被建模为 table 在同一个数据库中。
所以我的建议是采用多种 table 方法,因为您最终会在不同的自行车上使用相同的组件,反之亦然,因为在相同的基本自行车型号中有可选组件,例如相同的自行车,但车轮尺寸不同。
我觉得这个设计不错 - 将单个对象放在单独的表中是个好主意(在这种情况下,构成自行车的部件 - 特别是因为它们可以单独出售,而且自行车可以用不同的部件定制)
我认为继承自 Bicycle class 的简单预设 class 应该可以解决问题:
class BicycleFrame(models.Model): brand = models.ForeignKey(Brand) model = models.CharField(max_length=100) # class BicycleWheels, BicyclePedals etc.. class Bicycle(models.Model): frame = models.ForeignKey(BicycleFrame) wheels = models.ForeignKey(BicycleWheels) pedals = models.ForeignKey(BicyclePedals) # etc ... class PresetBicycle(Bicycle): pass class PurchaseableMixin(models.Model): user_id = models.ForeignKey(Customer) def purchase(self): # ... call this in the form handler to save this # instance of a bike in the database and maybe # email the customer to inform them of their purchase etc.. class Meta: abstract = True class PurchasedBicycle(Bicycle, PurchaseableMixin): pass
.. 然后您可以在您的管理区域中创建一个 PresetBicycle 然后在您向客户展示的视图中您可以默认显示 PresetBicycle 并提供一个购买它的表格,该表格会自动填写详细信息PresetBicycle 并在提交时创建 PurchasedBicycle 的实例(像 ReactJS 和 Backbone 或 Angular 这样的 JS 框架可能最适合客户视图)。
希望对您有所帮助!
P.S。请注意,我自己还没有测试过这种方法——我建议在版本控制中创建几个新分支(例如 git)并为每个分支设置单独的设置文件(从基本设置文件导入并使用每个人都有一个单独的数据库,这样就不必搞乱太多的迁移和过时的表)在做出最终决定之前测试几种方法——最好尽早弄清楚这些东西,这样你就不会最终做出大的结构稍后更改。
P.P.S 也不是我将品牌字段更改为外键,因为您稍后可能希望过滤品牌..