【问题标题】:django one-to-many relationdjango 一对多关系
【发布时间】:2012-06-11 06:08:06
【问题描述】:

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

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

似乎userfile--user 是一个1 - n 关系。 1 个用户文件可以关联多个用户。

那么,我应该用什么来表示这种关系呢? 在下面给出的 UserFile 类中,如果我使用

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

这只会产生相反的关系(即n-1 for userfile--user

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

【问题讨论】:

  • 在 Django 中创建1-N 关系的方法是使用外键。在这种情况下,我将在 User 模型中创建一个外键。我没有发现任何问题。
  • @DiegoNavarro 从不修改django的代码。除非你确定他们会接受你的补丁:这里肯定不是这种情况,因为它是特定于项目的。
  • 我不是在说修改任何Django代码,只是回答关系问题。在这种情况下,您应该将其子类化或创建一个中间件。

标签: python django


【解决方案1】:

我也非常想要一个 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')

那么你应该添加migrate auth_user来添加FK。

【讨论】:

  • 感谢您的回复..我在 djangoproject 网站上找不到对 contribute_to_class 的任何引用..为什么这被称为不受支持?
  • 因为它没有被记录,所以它不是“公共 API”的一部分。它受到未记录的潜在 BC 中断的影响。
【解决方案2】:

您可以为此使用用户配置文件,尽管我认为这有点矫枉过正。

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

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

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

Tutorial on userprofiles

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2018-08-28
    • 2013-04-06
    • 1970-01-01
    • 2011-06-22
    • 2017-07-16
    相关资源
    最近更新 更多