Django一对多关系

4
在我的应用程序中,我需要将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    | ...

用户文件表

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

用户_用户文件表

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

似乎userfile--user是一种1-n的关系。一个用户文件可以与多个用户相关联。
那么,我应该使用什么来表示这种关系呢?在下面给出的UserFile类中,如果我使用…
user = db.models.ForeignKey(django.contrib.auth.User)

这只会使得反向关系(即userfile--usern-1)变得更加复杂。

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

在Django中创建“1-N”关系的方法是使用Foreign Key。在这种情况下,我会在“User”模型中创建一个外键。我没有看到任何问题。 - Diego Navarro
@DiegoNavarro 永远不要修改Django的代码,除非你确定他们会接受你的补丁:这绝对不是这种情况,因为它是特定于项目的。 - jpic
1
我不是在谈论修改任何Django代码,只是回答关系问题。在这种情况下,您应该子类化它或创建一个中间件。 - Diego Navarro
2个回答

3

我也希望有一个OneToMany字段。但是我相信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')

然后您应该添加迁移auth_user以添加FK。


谢谢回复。我在djangoproject网站上找不到任何关于contribute_to_class的参考资料。为什么会被称为不支持的呢? - damon
因为它没有记录,所以它不是“公共API”的一部分。它可能存在未记录的潜在BC(向后兼容性)破坏。 - jpic

0

你可以使用用户配置文件来实现这个功能,不过我想这可能有点过度。

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

接着在settings.py中设置AUTH_PROFILE_MODULE,然后运行syncdb。

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

用户个人资料教程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接