对django foreignkey、manytomanyfield、inlineformset_工厂感到困惑

对django foreignkey、manytomanyfield、inlineformset_工厂感到困惑,django,foreign-keys,many-to-many,inline-formset,Django,Foreign Keys,Many To Many,Inline Formset,全部, 对于Django的ForeingKeys vs ManyToManyFields的底层模型,我缺少一些基本的东西 假设我正在构建一个关于汽车的应用程序。我可能有以下课程: class Car(models.Model): carName = models.CharField() class Manufacturer(models.Model): manufacturerName = models.CharField() class Wheel(models.Mode

全部,

对于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()
到目前为止还不错。现在这些类之间有一些关系。一辆汽车有一个制造商,有四个轮胎。但从概念上讲,这是有区别的。制造商通过“聚合”进行关联;一个制造商可以关联到多辆汽车;删除汽车实例不应导致该汽车的制造商也被删除。车轮通过“组合”进行关联;与一辆汽车相关联的每四个车轮都与该汽车相关,且仅与该汽车相关;删除汽车,车轮也应删除

因此,直觉上,这意味着我应该做以下几点:

 class Car(models.Model):
   carName = models.CharField()
   manufacturer = models.ManyToManyField("Manufacturer")
   wheels = models.ForeignKey("Wheel")
最后,我希望使用inlineformset_工厂,以便用户可以同时填写有关汽车、制造商和车轮的详细信息。大概是这样的:

 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)
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")
但我发现的大多数文档都建议,ForiegnKey应该从一个轮子转到另一个汽车上。在我看来,这似乎是倒退的,因为Wheel_表单集随后将向用户显示汽车的所有字段(“carName”),而不是车轮(“radius”)

仅仅是打这个问题就让我感到困惑。有谁能解释一下我是如何制作一个表格的,它包含了所有的汽车字段,然后是所有的制造商字段,然后是所有的车轮字段


谢谢

如果每辆车都有一个制造商,那么您应该使用从
制造商
的外键。这将允许多辆汽车拥有相同的制造商,并且当汽车被删除时,制造商不会被删除。多对多字段表明一辆车可以有多个制造商

车轮
应该有一把车的外键。这将允许多个车轮拥有同一辆汽车,当汽车被删除时,默认的Django行为将是删除车轮

因此,您的模型应该如下所示:

 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)
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")
对于您的视图,我将首先尝试分别为表单和表单集编写视图,并确保您在将所有模型组合到一个视图中之前了解它们之间的关系

这说明了如何同时使用表单和内联表单集(相当于您案例中的
汽车
车轮
模型)。对于制造商,您可能希望从
CarForm
查看
manufacturer
字段,然后在保存之前在视图中进行设置

...
manufacturer = ManufacturerForm.save()
car = CarForm.save(commit=False)
car.manufacturer = manufacturer
car.save()
...

谢谢你的回复。我是否可以确认,如果一辆汽车可以有多个制造商(比如,它是由一个团队制造的),那么我应该使用多个领域?是的,如果一辆汽车可以有多个制造商(并且一个制造商可以制造多个汽车),然后使用
ManyToManyField
。派对有点晚,但外键不是一对一关系吗?