我之前已经问过这个项目的问题,关于Django Admin,Inline,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 admin,因此它必须处理这个问题,最好也使用地址作为内联。(这就是我遇到的问题-因为我使用的是泛型关系,Django admin期望在content_type和object_id字段中有一些东西,当这些字段为空时会出错,而不是提供某种查找)。
干杯,维克多
发布于 2010-01-21 07:53:49
我认为您所做的比使用某种子类化(基类可以是抽象的,也可以不是)更复杂。
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)如果您不想在数据库中为基类创建单独的表,则应该考虑将基类(可寻址)抽象。
https://stackoverflow.com/questions/2105842
复制相似问题