2012-06-11 135 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