所有,困惑Django的外鍵,manytomanyfield,inlineformset_factories
我失去了一些東西有關Django的ForeingKeys VS ManyToManyFields底層模型的基礎。
假設我正在構建一個關於汽車的應用程序。我可能有以下類:
class Car(models.Model):
carName = models.CharField()
class Manufacturer(models.Model):
manufacturerName = models.CharField()
class Wheel(models.Model):
radius = models.IntegerField()
到目前爲止好。現在這些類之間有一些關係。一輛汽車有一個製造商,並有(四)個輪胎。從概念上講,雖然有區別。製造商通過「聚合」相關;製造商可以與多輛汽車相關聯;刪除Car實例不應該導致該汽車的製造商也被刪除。車輪通過「組合」相關;與汽車相關的每四個車輪都與該車相關聯,並且僅與該車相關聯;刪除汽車,車輪也應該刪除。
因此,直觀地,這意味着我應該做到以下幾點:
class Car(models.Model):
carName = models.CharField()
manufacturer = models.ManyToManyField("Manufacturer")
wheels = models.ForeignKey("Wheel")
最後,我想用inlineformset_factories,使用戶可以在大約一輛車,它的製造商和車輪都在填寫詳細信息同時。這樣的事情:
class CarForm(ModelForm):
class Meta:
model = Car
class ManufacturerForm(ModelForm):
class Meta:
model = Manufacturer
class WheelForm(ModelForm):
class Meta:
model = Wheel
Manufacturer_formset = inlineformset_factory(Car,Manufacturer,formset=ManufacturerForm)
Wheel_formset = inlineformset_factory(Car,Wheel,formset=WheelForm)
但我發現的大多數文件表明,ForiegnKey應該從車輪到汽車。這看起來倒退了,因爲Wheel_formset會向用戶顯示Car(「carName」)而不是Wheel(「radius」)的所有字段。
只是打字這個問題的行爲讓我感到困惑。任何人都可以闡明我如何構建一個擁有所有汽車領域,然後是所有制造商領域,然後是所有車輪領域的形式。
感謝
謝謝你的迴應。我可以證實,如果一輛汽車可以有多個製造商(比如它是由一個團隊製造的),那麼我應該使用一個ManyToManyField? – trubliphone 2012-01-16 04:38:42
是的,如果汽車可以有多個製造商(並且製造商可以製造更多的汽車),則使用'ManyToManyField'。 – Alasdair 2012-01-16 10:22:54
派對遲到了,但是外鍵不會是多對一的關係嗎? – 2014-11-04 14:36:26