2010-01-20 135 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) 

如果你不想在你的數據庫中爲它分開一個表,你應該考慮做基類(可尋址)摘要。