2010-06-02 64 views
0

我正在寫在Django一個項目,我已經5種用戶組:經理,模型繼承或什麼切片用戶在Django?

  • 組別1
  • 組2
  • ...

然後我有一個模型,Item與用戶有很多關係,該項目有一個所有者(Group1中的用戶),Customer(Group2中的用戶)和許多RelatedUser(Group3中的用戶)。

我想知道哪些是寫這種關係的正確方法。我很想寫這樣的東西:

class Item(models.Model): 
    owner = models.ForeignKey(Owner) 
    customer = models.ForeignKey(Customer) 
    users = models.ManyToManyField(RelatedUser) 

以某種方式定義了Owner,Customer和RelatedUser類。

我不知道如何做到這一點。我不想使用模型繼承,因爲我只想要一個表User。即使經理似乎並沒有幫助我。其實我使用的是這樣的:

try: 
    customer = models.ForeignKey(User, 
           related_name='cust', 
           limit_choices_to = {'groups__in': [Group.objects.get(name = 'customers')]}) 
except: 
    customer = models.ForeignKey(User, 
           related_name='cust') 

主要是因爲開始時形成一個空數據庫集團客戶'不存在,錯誤引發。

哪種方法可以負擔得起?

預先感謝

+0

「即使管理員似乎沒有幫助我」?真?爲什麼不?你嘗試了什麼? – 2010-06-02 15:15:23

回答

0

你可以定義每個用戶類型不同的模型 - 每一個ForiegnKey給用戶。好處是簡單,但不利的一面是,這種方法增加了多個表,如果您以後需要添加更多組,則不具有可擴展性。

另一種選擇是定義組模型,該模型存儲可用的不同類型組,並且與用戶具有ManyToMany關係(假設一個用戶可以在多個組中)。

通過爲組模型創建一個固定裝置,您可以解決從新數據庫啓動時未定義組的問題。夾具是一個文本文件(默認爲JSON格式),它定義了一組可以自動或手動輕鬆加載到數據庫中的數據。使用dumpdata管理命令可以輕鬆地從現有數據創建夾具。

如果您希望自動加載燈具(當您運行syncdb時),請在您的應用中創建一個fixtures目錄,並命名燈具initial_data。您還可以創建其他燈具,並使用loaddata命令加載它們,或者在您的測試中指定fixtures list for a particular TestCase

+0

據我所知,fixtures不會阻止我之前展示的錯誤(try:except :),因爲模型在創建模型之前被解析,並且當'groups_is'的定義到達時,它會分解。實際上我使用的是django.contrib.auth提供的組模型。 – 2010-06-02 16:03:59