Django模型,理解一对一的关系

时间:2014-08-28 04:54:41

标签: python django django-models

我很难理解一对一关系的目的是什么

我有一个用户填写信息的表单,并选择一个福利类型。

例如,我有一个

模型
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,我有通勤,健身和人体工程学

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

这是否意味着在django中,一对一的关系是一个表只能有一种类型的另一个表?

2 个答案:

答案 0 :(得分:3)

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

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

我建议查看相关文档以获得更全面的解释:https://docs.djangoproject.com/en/dev/topics/db/examples/one_to_one/

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

答案 1 :(得分:1)

看起来你真正想要的不是OneToOneField,而是一个ForeignKey。如果您希望模型之间存在一对多关系,即BenefitRequest可以占用您的任何福利类型。你需要一个ForeignKey到BenefitType。然后,您可以多次创建任何BenefitRequest并选择任何BenefitType:

benefitType = models.ForeignKey(BenefitType)

想到OneToOne字段的一种方法是它们很可能属于同一个模型(或数据库表),它们是相同的"记录"真的,由于一些"约束"而分开了。例如,尝试从django.contrib.auth重新使用User,并且知道您不能在不破坏应用程序的其他部分的情况下扩展模型。