2011-06-21 186 views
0

嗨我的系統中有很多用戶被分類到不同的類型中。我想存儲所有這些用戶的地址詳細信息。例如,用戶可以是學生,學校或特許經營者。這裏的所有用戶都可以擁有與他們相關的地址信息。在Django的另一個模型中對同一模型的多個引用

from django.db import models 
from django.contrib.auth.Models import User 

class Address(models.Model): 
    user = models.OneToOneField(User) 
    address = models.TextField() 

class Student(models.Model): 
    user_id = models.ForeignKey(User) 
    address = models.ForeignKey(Address) 

class School(models.Model): 
    user_id = models.ForeignKey(User) 
    address = models.ForeignKey(Address) 
    contact_person_name = models.CharField(max_length=50) 

在這種情況下有2個引用用戶模型 - 一個通過USER_ID和另一個通過address.user雖然他們應該是指同一個實例。重複引用是不好的做法嗎?

我想在地址中忽略'user'外鍵,但我認爲如果沒有用戶,地址就不能存在。如何更好地模擬這個?

回答

1

正如你已經提到中同一領域的重複一個模型不是一個好主意。

如果這些是你的實際模型,我會使用abstract models建議你:

from django.db import models 
from django.contrib.auth.Models import User 

class Profile(models.Model): 
    user = models.OneToOneField(User, related_name="%(app_label)s_%(class)s_related") 
    address = models.TextField() 

    class Meta: 
     abstract = True 

class Student(Profile): 
    pass 

class School(Profile): 
    contact_person_name = models.CharField(max_length=50) 

這將產生兩個表:學生,學校與領域 用戶,地址和用戶,地址,分別contact_person_name 。

+0

嗨@crodjer,在一個完全不同的場景中,我想存儲用戶的開支並對它們進行分類,我怎樣才能使用你已經解釋的相同概念?每筆費用記錄都將與用戶相關聯。對於每筆費用,用戶將不得不關聯他創建的其中一個類別。所以我會有'類別(用戶,名稱)'和'費用(用戶,金額,類別)'之類的東西。但用戶參考在這裏重複。由於沒有共享,我想我不能使用抽象類。 – Guruprasad

+0

由於學校的地址和學生的地址是類似的信息,因此不應將它們存儲在一個表中而不是2中,如上面抽象類的示例中那樣? – Guruprasad

相關問題