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)
在我的数据库中,福利类型包括通勤、健身和人体工学。
但是,当我填写表单并为用户A选择“健身”并提交后,再为用户B选择“健身”并再次提交时,系统却提示我说“福利类型已经被使用”。尽管这是为另一个用户的新请求。
这是否意味着在Django中,一对一关系是指一个表只能有另一个表中的一种类型?
2 个回答
看起来你真正想要的不是一对一的字段,而是外键。如果你想在你的模型中建立一对多的关系,比如说一个申请可以对应多种福利类型,那你就需要一个指向福利类型的外键。这样你就可以创建任何申请,并且可以选择任意数量的福利类型:
benefitType = models.ForeignKey(BenefitType)
一对一字段可以理解为它们可以属于同一个模型(或者说同一个数据库表),其实它们是同一条“记录”,只是因为某些“限制”而分开了。例如,想要重用django.contrib.auth中的用户模型,但你知道不能随便扩展这个模型,否则会影响到你应用的其他部分。
没错,这种情况不仅仅适用于Django。所谓一对一关系,就是一个数据库表中的每一行都只和另一个表中的一行相连。比如说,如果有一个叫X的表和一个叫Y的表,那么X表中的每一行都对应Y表中的一行。
在Django中,一对一字段的意思是你有一个字段,它的值只和另一个字段相关联。Django文档中的例子提到了一家餐厅和它的地址。这样就很清楚了:一家餐厅只有一个地址(当然,现实中有些特殊情况,比如一栋楼可能有多个地址,但这很少见)。
我建议你查看一下相关的文档,里面会有更详细的解释:https://docs.djangoproject.com/en/dev/topics/db/examples/one_to_one/
如果你想让你的“福利类型”可以被多个用户使用,你可以考虑使用多对一的关系。