全,
关于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_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会向用户显示汽车的所有字段("carName"),而不是车轮("radius")。
仅仅是输入这个问题的行为就让我感到困惑。有没有人可以解释一下如何创建一个窗体,其中包含所有的汽车字段,然后是所有的制造商字段,然后是所有的车轮字段。
谢谢
发布于 2012-01-16 05:20:03
如果每辆车都有一个制造商,那么您应该使用从Car
到Manufacturer
的外键。这将允许多辆汽车具有相同的制造商,并且在删除汽车时不会删除制造商。多对多领域表明,一辆汽车可以有多个制造商。
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")
对于您的视图,我将首先尝试分别为表单和表单集编写视图,并确保在将它们放在一个视图中之前了解模型之间的关系。
此Stack Overflow question解释如何同时使用表单和内联表单集(相当于本例中的Car
和Wheel
模型)。对于制造商,您可能希望从CarForm
中exclude
manufacturer
字段,然后在保存之前在视图中设置它。
...
manufacturer = ManufacturerForm.save()
car = CarForm.save(commit=False)
car.manufacturer = manufacturer
car.save()
...
https://stackoverflow.com/questions/8872030
复制相似问题