9

全て、

Django の ForeingKeys と ManyToManyFields の基礎となるモデルについて、何か基本的なことが欠けています。

車に関するアプリケーションを構築しているとします。次のクラスがあるかもしれません:

 class Car(models.Model):
   carName = models.CharField()

 class Manufacturer(models.Model):
   manufacturerName = models.CharField()

 class Wheel(models.Model):
   radius = models.IntegerField()

ここまでは順調ですね。現在、これらのクラス間にいくつかの関係があります。車にはメーカーがあり、タイヤが (4 つ) あります。ただし、概念的には違いがあります。メーカーは「集約」によって関連付けられます。メーカーは複数の車に関連付けることができます。Car インスタンスを削除しても、その車のメーカーも削除されるべきではありません。ホイールは「構成」によって関連付けられています。車に関連付けられている 4 つの車輪はすべて、その車のみに関連付けられています。車を削除すると、車輪も削除する必要があります。

したがって、直感的には、次のことを行う必要があることを意味します。

 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 から Car に移動する必要があることを示唆しています。Wheel_formset は、Wheel (「radius」) ではなく、Car (「carName」) のすべてのフィールドをユーザーに提示するため、これは逆に思えます。

この質問を入力するだけで、私は混乱します。すべての車のフィールド、すべてのメーカーのフィールド、すべてのホイールのフィールドを持つフォームを作成する方法について、誰かが光を当てることができますか?

ありがとう

4

1 に答える 1

15

各自動車に 1 つのメーカーがある場合は、 from から までの外部キーを使用する必要がありCarますManufacturer。これにより、複数の車が同じメーカーを持つことができ、車が削除されてもメーカーは削除されません。多対多フィールドは、1 台の車が複数のメーカーを持つことができることを示唆しています。

Wheelへの外部キーが必要Carです。これにより、複数の車輪が同じ車を持つことができ、車が削除されたときのデフォルトの Django の動作は車輪を削除することになります。

したがって、モデルは次のようになります。

class Manufacturer(models.Model):
    name = models.CharField()

class Car(models.Model):
    name = models.CharField()
    manufacturer = models.ForeignKey("Manufacturer")

class Wheel(models.Model):
    radius = models.IntegerField()
    car = models.ForeignKey("Car")

ビューについては、最初にフォームとフォームセットのビューを個別に記述し、モデル間の関係を理解し​​てから、それらをすべて 1 つのビューにまとめるようにします。

このスタック オーバーフローの質問では、フォームとインライン フォームセットを同時に使用する方法について説明しています (この場合のCarWheelモデルに相当します)。メーカーの場合は、おそらくからフィールドに移動しexclude、保存する前にビューに設定する必要があります。manufacturerCarForm

...
manufacturer = ManufacturerForm.save()
car = CarForm.save(commit=False)
car.manufacturer = manufacturer
car.save()
...
于 2012-01-15T21:20:03.330 に答える