2010-01-20 108 views
0

我以前曾问过关于Django Admin,Inline,Generics等这个项目的问题,再次感谢为这些人提供答案的人。有关背景,这些问题在这里:Django模型设计

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领域有地址的每个对象(ES)上?

其次,有没有更好的选择使用通用关系这种情况下,不同的对象都有地址?在另一篇文章中,有人提到使用抽象类 - 我想到了这一点,但似乎有相当多的重复,因为地址模型基本上都是相同的。我们将大量使用Django管理员,所以它必须使用它,最好也使用地址作为内联(这是我遇到问题的地方 - 因为我使用的是通用关系,Django管理员期待content_type和object_id字段中的内容,并且当这些内容为空时会出错,而不是进行某种查找)。

干杯, 维克多

回答

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) 

如果你不想在你的数据库中为它分开一个表,你应该考虑做基类(可寻址)摘要。