django一对多的关系

时间:2012-06-11 06:08:07

标签: python django

在我的应用中,我需要将Useruser-selected-filename

相关联

用户只能选择一个文件名。但许多用户可以选择相同的文件名

所以,数据库表可能是这样的

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-1} {/ 1> userfile--user

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

2 个答案:

答案 0 :(得分:3)

我也非常喜欢OneToMany字段。但是Django中没有这样的领域的原因我相信这会在相关模型的表格上创建一个FK:

  1. 这有点令人困惑

  2. Syncdb无法将列添加到现有表

  3. 在相关模型上添加FK的解决方案是使用“不支持”功能:

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

    然后你应该添加migrate auth_user来添加FK。

答案 1 :(得分:0)

你可以使用userprofiles,虽然我认为它有点矫枉过正。

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

然后在settings.py中设置AUTH_PROFILE_MODULE设置并运行syncdb。

现在,您可以使用user.get_profile().file访问与user相关联的文件。

Tutorial on userprofiles