我正在寻找一种对数据进行建模的干净方法,该方法是可选的,但是如果包含的话,它将包含对其他数据的引用。
在下面的示例中,最干净的关系建模是将人员,保险计划和保险公司分开。
class InsurancePlan(models.Model):
name = models.CharField(max_length=100, default="Not Indicated")
insurancecompany = models.ForeignKey(InsuranceCompany, on_delete=models.CASCADE, null=True, blank=True)
claims_address = models.OneToOneField(UsLocation, on_delete=models.CASCADE, blank=True, null=True)
class InsuranceCompany(models.Model):
name = models.CharField(max_length=50)
some_important_id = models.CharField(max_length=50)
class Insured(models.Model):
name = models.CharField(max_length=50)
plan = models.ForeignKey(InsurancePlan, on_delete=models.CASCADE)
,然后向被保险人模型添加member_id
字段,或创建一个链接它们的Insured_Plan
表。
但是,如果业务需求说拥有InsurancePlan
信息是可选的,那是因为我们可以通过仅知道成员ID和InsuranceCompany
来获得信息怎么办?
可以:
class Insured(models.Model):
name=...
plan = models.ForeignKey(InsurancePlan, on_delete=models.CASCADE, null=True, blank=True)
insurance_summary = models.ForeignKey(InsuranceCompany, on_delete=models.CASCADE)
member_id = models.CharField()
对关系建模有点生锈,但是我认为从A到B有一个fk,从A到C有一个fk,而C也有从F到B的情况。
更新:我认为最好的方法是
class Insured(models.Model):
name=models.CharField(max_length=20)
class InsurancePlan(models.Model):
name=models.CharField(max_length=20, defualt="unknown/not_applicable")
members=ManyToManyField(Insured, through='Membership')
claims_address=models.OneToOneField(UsLocation, blank=True, null=True)
insurance_company=models.ForeignKey(InsuranceCompany, on_delete=models.CASCADE)
class Membership(models.Model):
insured=ForeignKey(Insured, on_delete=models.CASCADE)
plan=ForeignKey(InsurancePlan, on_delete=models.CASCADE)
member_id=models.CharField(max_length=30)
,然后只需将InsurancePlan
设为必需,因为我们可以将通用空白计划用作默认值。