2014-08-28 35 views
0

林有困难的理解是什么目的的一对一的关系Django模型,了解一对一的关系

我有一个表格,用户填写相关信息,并选择效益型。

例如,我有

class BenefitRequest(models.Model): 
    benefitType = models.OneToOneField(BenefitType) 
    description = models.CharField(max_length=100) 
    benefitAccount = models.ForeignKey(BenefitsAccount 

class BenefitType(models.Model): 
    benefit = models.CharField(max_length=25) 

模型在我的数据库,为BenefitType,我上下班,健身,以及人体工程学

然而,当我填写表格,并选择“健身“并提交表单,然后再为PersonB选择”健身“并再次提交,这会给我一个错误,说明我的BenefitType已被使用。即使这是另一个用户的新请求。

这是否意味着在Django,一对一的关系是一个表可以只有一个类型的每个另一个表?

回答

3

这是正确的。这不是Django所特有的;一对一关系意味着一个数据库表中的每一行都链接到另一个表中的另一行,而另一个表中的另一行则链接到另一个表中。在名为X的表和名为Y的表之间的一对一关系中,X中的每一行都与Y中的一行相关联。

对于一对一字段(在您的情况中,在Django中)您有一个字段的值与另一个字段相关联。 Django文档示例是指具有地址的餐厅。这应该使关系清楚:一个餐厅有一个地址(除了一些罕见的现实世界的例外,其中一个建筑物可能有多个地址与之相关联)

我建议查看相关文档以更彻底解释:https://docs.djangoproject.com/en/dev/topics/db/examples/one_to_one/

如果您希望您的“福利类型”可供多个用户使用,您可以考虑使用多对一关系。

1

看来你真正想要的不是一个OneToOneField,它似乎只是一个ForeignKey。如果您想在您的模型之间建立一对多关系,即BenefitRequest可以占用您的任何福利类型。您需要一个ForeignKey以BenefitType。然后,你可以创建任何BenefitRequest并选择任意BenefitType任意次数:想OneToOne场

benefitType = models.ForeignKey(BenefitType) 

的一种方式是,他们能够很好地属于同一型号(或数据库表),它们是相同的“记录”真的是因为一些“约束”而分开的。例如,试图从django.contrib.auth中重新使用User,并且知道不能在不破坏应用程序的其他部分的情况下扩展模型。