首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >困惑于django的外场,许多任何领域,inlineformset_factories

困惑于django的外场,许多任何领域,inlineformset_factories
EN

Stack Overflow用户
提问于 2012-01-16 02:06:38
回答 1查看 5.5K关注 0票数 9

全,

关于Django的ForeingKeys vs ManyToManyFields的底层模型,我缺少一些基本的东西。

假设我正在构建一个关于汽车的应用程序。我可能有以下几个类:

代码语言:javascript
运行
复制
 class Car(models.Model):
   carName = models.CharField()

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

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

到目前一切尚好。现在,这些类之间存在一些关系。一辆汽车有一个制造商,有(四)个轮胎。但从概念上讲,这是有区别的。制造商是通过“聚合”关联的;一个制造商可以关联到多辆汽车;删除一个汽车实例不应该导致该汽车的制造商也被删除。轮子通过“组合”联系在一起;每四个轮子与一辆车相关联,并且只与那辆车相关联;删除这辆车,轮子也应该被删除。

因此,直观地说,这意味着我应该做以下事情:

代码语言:javascript
运行
复制
 class Car(models.Model):
   carName = models.CharField()
   manufacturer = models.ManyToManyField("Manufacturer")
   wheels = models.ForeignKey("Wheel")

最终,我想使用inlineformset_factories,这样用户就可以同时填写有关汽车、制造商和车轮的详细信息。如下所示:

代码语言:javascript
运行
复制
 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")。

仅仅是输入这个问题的行为就让我感到困惑。有没有人可以解释一下如何创建一个窗体,其中包含所有的汽车字段,然后是所有的制造商字段,然后是所有的车轮字段。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-16 05:20:03

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

Wheel应该有一个指向Car的外键。这将允许多个轮子具有相同的汽车,删除汽车时的默认Django行为将是删除轮子。

所以你的模型应该看起来像这样:

代码语言:javascript
运行
复制
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解释如何同时使用表单和内联表单集(相当于本例中的CarWheel模型)。对于制造商,您可能希望从CarFormexclude manufacturer字段,然后在保存之前在视图中设置它。

代码语言:javascript
运行
复制
...
manufacturer = ManufacturerForm.save()
car = CarForm.save(commit=False)
car.manufacturer = manufacturer
car.save()
...
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8872030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档