我之前曾就此项目提出过有关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字段中的某些内容,并且当这些字段为空时错误输出,而不是提供某种查找。)
干杯, 维克多
答案 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)
如果你不想在数据库中为它创建一个单独的表,你应该考虑使基类(可寻址)抽象。