簡體   English   中英

數據庫和類設計Django

[英]Database and class design 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)如果這是正確的設計,那么我希望能夠在添加自行車的同時即時添加輪子(不必分別添加輪子)。 最好的方法是什么?

非常感謝您的任何提示/參考。 我是django的初學者...

我懷疑(在現實生活中)您是否真的會在自行車和車輪之間建立一對一的關系-肯定有多個自行車模型會使用相同的車輪。

自行車品牌/型號與部件之間存在類似的現實關系,例如撥鏈器,制動器,曲柄,踏板等。

順便說一下,您不會為每個組件擁有單獨的數據庫 ,每個組件都將被建模為同一數據庫內的一個

因此,我的建議是采用多表方法,因為最終您將擁有在不同自行車上使用的相同組件,對於相同基本自行車模型中存在可選組件(例如,相同自行車但車輪尺寸不同)的情況,反之亦然。

  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 

..然后您可以在管理區域中創建PresetBicycle,然后在向客戶顯示的視圖中,默認情況下可以顯示PresetBicycle並提供購買表單,該表單會自動填充PresetBicycle的詳細信息並創建一個提交時的PurchasedBicycle實例(像ReactJS和Backbone這樣的JS框架,或者Angular可能是最適合客戶視圖的)。

希望這可以幫助!

PS注意,我自己尚未測試過這種方法-建議您在Version Control中創建一些新分支(例如git),並為每個分支設置單獨的設置文件(從基本設置文件導入並使用單獨的數據庫)這樣一來,每個人就省去了太多的遷移和過時的表),可以在做出最終決定之前先測試幾種方法-最好盡早弄清這些東西,以免以后再進行大的結構更改。

PPS另外,我還沒有將品牌字段更改為ForeignKey,因為您以后可能希望過濾該品牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM