Модели с необязательными полями с отношениями - PullRequest
0 голосов
/ 16 сентября 2018

Я ищу чистый способ моделирования данных, который не является обязательным, но если он будет включен, будет содержать ссылку на другие данные.

В приведенном ниже примере самое чистое реляционное моделирование состоит в том, чтобы отделить человека, план страхования и страховую компанию.

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()

Я немного заржавел в реляционном моделировании, но я думаю, что у меня есть fk от A до B, а у другого от A до C, где у C естьfk to 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 обязательным, поскольку мы можемиспользовать общий пустой план по умолчанию.

...