Django模型设计

时间:2010-01-20 23:26:09

标签: django database-design

我之前曾就此项目提出过有关Django Admin,Inlines,Generics等的问题。再次感谢那些为这些人提供答案的人。对于背景,这些问题在这里:

Django - Designing Model Relationships - Admin interface and Inline

Django Generic Relations with Django Admin

但是,我想我应该再次审查我的模型,以确保它实际上是“正确的”。所以我的重点是数据库设计,我想。

我们有一个带有多个对象的Django应用程序 - 用户(拥有用户配置文件),医院,部门,机构(即教育机构) - 所有人都有多个地址(或没有地址)。很可能其中很多都有多个地址。

多个对象也可能具有相同的地址,但这种情况很少见,我很乐意为那些发生的实例重复。

目前,该模型是:

class Address(models.Model):
    street_address = models.CharField(max_length=50)
    suburb = models.CharField(max_length=20)
    state = models.CharField(max_length=3, choices=AUSTRALIAN_STATES_CHOICES)
    ...
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    ...
class Hospital(models.Model):
    name = models.CharField(max_length=20)
    address = generic.GenericRelation(Address)
    ...
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    address = generic.GenericRelation(Address)
    ...

首先 - 我做得对吗,每个具有地址的对象都有FK字段?

其次,对于这种情况,是否有更好的替代方法使用通用关系,其中不同的对象都有地址?在另一篇文章中,有人提到使用抽象类 - 我想到了这一点,但似乎有相当多的重复,因为地址模型对所有人来说基本相同。

此外,我们将大量使用Django管理员,所以它必须使用它,最好也使用地址作为内联。(这就是我遇到问题的地方 - 因为我使用的是通用关系,Django管理员是期待content_type和object_id字段中的某些内容,并且当这些字段为空时错误输出,而不是提供某种查找。)

干杯, 维克多

1 个答案:

答案 0 :(得分:0)

我认为你所做的比使用某种子类更复杂(基类可以是抽象的,也可以不抽象)。

class Addressable(models.Model):
  ...   # common attributes to all addressable objects

class Hospital(Addressable):
  name = models.CharField(max_length=20)
  ...

class UserProfile(models.Model):
  user = models.ForeignKey(User, unique=True)

class Address(models.Model):
  street_address = models.CharField(max_length=50)
  suburb = models.CharField(max_length=20)
  state = models.CharField(max_length=3, choices=AUSTRALIAN_STATES_CHOICES)
  ...
  owner = models.ForeignKey(Addressable)

如果你不想在数据库中为它创建一个单独的表,你应该考虑使基类(可寻址)抽象。