数据库和 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 方法,因为您最终会在不同的自行车上使用相同的组件,反之亦然,因为在相同的基本自行车型号中有可选组件,例如相同的自行车,但车轮尺寸不同。

  1. 我觉得这个设计不错 - 将单个对象放在单独的表中是个好主意(在这种情况下,构成自行车的部件 - 特别是因为它们可以单独出售,而且自行车可以用不同的部件定制)

  2. 我认为继承自 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 也不是我将品牌字段更改为外键,因为您稍后可能希望过滤品牌..