如何在Django模型中与父表共享子外部表

时间:2018-07-15 23:02:11

标签: python django django-models

我目前有此设置:

class Address (models.Model):
    Member = models.ForeignKey(Member, blank=True, null=True, on_delete=models.CASCADE)
    Unit = models.ForeignKey(Unit, blank=True, null=True, on_delete=models.CASCADE)
    Address1 = models.TextField(max_length=512)
    Address2 = models.TextField(max_length=512, null=True, blank=True)
    City = models.TextField(max_length=100)
    State = models.TextField(max_length=100)
    Zip = models.TextField(max_length=25)
    Latitude = models.FloatField(null=True, blank=True)
    Longitude = models.FloatField(null=True, blank=True)
    Primary = models.BooleanField(default=False)


class Phone (models.Model):
    Member = models.ForeignKey(Member, blank=True, null=True, on_delete=models.CASCADE)
    Unit = models.ForeignKey(Unit, blank=True, null=True, on_delete=models.CASCADE)
    Phone = models.CharField(max_length=25)
    Type = models.CharField(max_length=25)
    Primary = models.BooleanField(default=False)


class Member (models.Model):
    FederationID = models.FloatField(unique=True)
    UserId = models.ForeignKey(User, on_delete=models.CASCADE)
    height = models.IntegerField(blank=True, null=True)
    eye = models.CharField(blank=True, null=True)
    hair = models.CharField(blank=True, null=True)
    bio = models.TextField()


class Unit (models.Model):
    Name = models.CharField(max_length=255)
    Hull = models.CharField(max_length=20)
    Type = models.CharField(max_length=20)

我正在尝试使用一个地址表来模仿会员和单位的地址。
我问这是否是正确的方法?是否有更多的DRY版本可以正确执行此操作。还要注意电话型号。同样的问题。谢谢。

1 个答案:

答案 0 :(得分:0)

如果多个成员共享同一地址怎么办?如果有新型号也需要地址怎么办?在“成员”和“单位”模型中放置“地址”字段,而不是相反,可能是一种轻巧的清洁方法。

class Member(Model):
    Address = ForeignKey(...)

class Unit(Model):
    Address = ForeignKey(...)

,然后从“地址”中删除“成员”和“单位”字段。认为一个成员具有一个地址而不是一个地址具有一个成员是更直观的。