数据库和类设计 Django



我正在建立一个用django销售自行车的网站。我有一辆包含自行车的自行车类;它看起来像这样:

class Bike(models.Model):
    brand = models.CharField(max_length=100)
    model = models.CharField(max_length=100)

现在我想添加一个描述自行车车轮的字段轮,我希望这个字段可能包含几个字段,例如品牌、车轮的大小。我希望将车轮实现的这些细节与自行车的等级规格分开;但是,我希望每个车轮只与一辆自行车相关联。

我的一个想法是执行以下操作:

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)如果这是正确的设计,那么我希望能够在添加自行车的同时即时添加车轮(永远不必单独添加车轮)。最好的方法是什么?

非常感谢任何提示/参考。我是姜戈的初学者...

我怀疑(在现实生活中)自行车和车轮之间真的会有一对一的关系——不止一个自行车型号肯定会使用相同的车轮。

自行车品牌/型号与拨链器、制动器、曲柄、踏板等组件之间存在类似的现实生活关系。

顺便说一下,您不会为每个组件提供单独的数据库,每个组件将建模为同一数据库中的

所以我的建议是采用多表方法,因为您最终会在不同的自行车上使用相同的组件,反之亦然,如果同一基本自行车模型中有可选组件,例如相同的自行车但不同的车轮尺寸。

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

  2. 我认为从 Bicycle 类继承的简单预设类应该可以解决问题:

    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
    

.. 然后,您可以在管理区域中创建一个 PresetBike,然后在您向客户显示的视图中,您可以默认显示 PresetBike,并提供一个购买表单,该表单会自动填充 PresetBike 的详细信息,并在提交时创建 PurchasedBicycle 的实例(一个 JS 框架,如 ReactJS 和 Backbone, 或 Angular 可能最适合客户视图)。

希望这有帮助!

附言请注意,我自己还没有测试过这种方法 - 我建议在您的版本控制中创建一些新分支(例如 git)并为每个分支设置单独的设置文件(从基本设置文件导入并为每个文件使用单独的数据库,以节省在做出最终决定之前必须弄乱太多的迁移和过时的表格)以测试几种方法 - 尽早弄清楚这些东西是件好事这样你以后就不会做出重大的结构改变。

P.P.S也不是说我把品牌字段改成了外键,因为你以后可能希望过滤品牌。

最新更新