2012-06-11 63 views
4

在我的應用程序,我需要的Useruser-selected-filenameDjango的一個一對多的關係

用戶相關聯只能選擇一個filename.But相同的文件名可以由許多用戶

所以選擇,數據庫表可能是這樣

AUTH_USER(由django.contrib.auth創建)

----------------------------------------- 
id | username | first_name | last_name | ... 
------------------------------------------ 
1 | bert  | bert  | russel |... 
------------------------------------------ 
2 | jon  | jon  | snow  | ... 
------------------------------------------- 
3 | alice | alice  | tanner | ... 

userfile的表

----------------------------------------------- 
id | filename    
------------------------------------------------ 
1 | '/clips/summary.mp4' 
------------------------------------------------ 
2 | '/clips/intro.mp4'  
------------------------------------------------ 

user_userfile表

----------------------------------- 
user_id | userfile_id 
----------------------------------- 
    1  | 1 
----------------------------------- 
    2  | 1 
----------------------------------- 
    3  | 2 
----------------------------------- 

看來userfile--user1 - n關係。 1個用戶文件可以與許多用戶關聯。

那麼,我應該用什麼來表示這種關係? 在課堂userfile的下面給出的,如果我用

user = db.models.ForeignKey(django.contrib.auth.User) 

那樣只會讓反向關係(即n-1userfile--user

class UserFile(db.models.Model): 
    filename = db.models.CharField() 
    user  = ?? 
+0

創造Django的'1-N'關係的方法是使用一個外鍵。在這種情況下,我會在'User'模型中創建一個外鍵。我沒有看到任何問題。 –

+0

@DiegoNavarro **從不**修改Django的代碼。除非你確定他們會接受你的補丁:由於它是特定於項目的,所以這裏肯定不是這種情況。 – jpic

+1

我不是在談論修改任何Django代碼,只是回答關係問題。在這種情況下,您應該創建子類或創建中間件。 –

回答

3

我真的想一個一對多場了。但在Django沒有這樣的領域,我相信的理由是,這將在相關模型的表創建一個FK:

  1. 這是有點混亂

  2. 執行syncdb就不能列添加到現有的表

添加FK上的相關模型的解決方法是使用一個「不支持」的功能:

from django.contrib.auth.models import User 
models.ForeignKey(Badge, null=True, blank=True).contribute_to_class(User, 'badge') 

然後您應該添加migrate auth_user添加FK。

+0

感謝您的答覆..我找不到任何對djangoproject網站上的'contribute_to_class'的引用。爲什麼這被稱爲不受支持? – damon

+0

因爲它沒有記錄,所以它不是「公共API」的一部分。它受到無證BC潛力的影響。 – jpic

+0

對於可重用應用程序來說,這是非常好的和有點魔力的 – Goin

0

你可以使用userprofiles來做這件事,但我想這會有點矯枉過正。

class UserProfile(models.Model): 
    file = models.ForeignKey(UserFile) 

然後在settings.py中設置AUTH_PROFILE_MODULE設置並運行syncdb。

現在,您可以使用user.get_profile().file來訪問與user關聯的文件。

Tutorial on userprofiles