有很多模型,我已经开始考虑公共块,目的是使我的数据库达到第二范式。由于应用程序应由销售团队使用,因此大多数条目都是某种订单。我的模型文件的摘录如下所示:
class Order(models.Model):
dl = models.CharField(max_length=100)
cl = models.CharField(max_length=100)
(...)
class Setup(models.Model):
order = models.ForeignKey(Order) # could be OneToOneField()
name = models.CharField(max_length=200)
package = models.CharField(choices=(
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
('XL', 'Extra large'),
('C', 'Custom')
), max_length=2)
server = models.ForeignKey(Webserver)
(...)
虽然将订单详细信息保留在设置订单的模型之外没有任何合理意义,但它有助于保持项目的可维护性,因为设置订单不是唯一的内容,这样您就可以更改order
模型和所有其他模型/订单也会更新。
这就是问题所在。对于像Setup.server
这样的属性,Django的默认行为是创建公司可以提供的所有Web服务器的下拉列表。如果团队决定添加另一个,则可以在另一个页面上创建另一个服务器选项。但是对于order
,我希望OrderForm
与SetupForm
包含在同一页面上,理想情况下是单独的Fieldset
。提交表单后,应将新order
添加到数据库中,并填写Setup.order
。我知道我可以为这种特殊情况编写代码,但应用程序将包含多种形式,因此通用解决方案会更好。
一种可能的解决方案是使用自定义选项和通用视图创建自定义models.ForeignKey
或models.OneToOneField
,而不是使用两种形式呈现模板,然后链接对象。
有没有人有类似的问题?有没有人知道一个简单的,甚至可能是内置的解决方案?
编辑1
我已经考虑inline formsets
这是使用此示例的similar question的解决方案
class Contact(models.Model):
...
class Communication(models.Model):
contact = models.ForeignKey(Contact)
并使用通信字段集。但是,这会将包含为子类的类视为我的示例中的情况。但它仍然是一种选择,即使它仍然必须自动化,因此它可以快速用于其他模型之间的所有链接。