具有关系的可选字段的模型

时间:2018-09-15 21:07:23

标签: python django django-models

我正在寻找一种对数据进行建模的干净方法,该方法是可选的,但是如果包含的话,它将包含对其他数据的引用。

在下面的示例中,最干净的关系建模是将人员,保险计划和保险公司分开。

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设为必需,因为我们可以将通用空白计划用作默认值。

0 个答案:

没有答案