Django - 基于标准的自定义文件上传

时间:2017-10-10 12:16:54

标签: python django django-models django-forms

我目前正在努力寻找解决以下问题的最佳方法:

我使用django-registration实现了用户注册,我希望每个用户能够上传不同的文档集。每个用户都有一个"代理商",需要一些额外的文件,但这些文件可能会有所不同。

因此,我的用户基类将与每个用户所需的所有基本文档具有一对一的关系,但是我不确定如何让每个代理商定义他们自己的文档集以及如何将其与用户。

感谢。

1 个答案:

答案 0 :(得分:0)

听起来像这些不是一对一的关系,而是一对多(特别是:一个用户对多个文档)。

这将导致Document包含对用户的ForeignKey。 如果一个文档可以链接到许多用户,这甚至可能是多对多的关系。

如果文档可以在用户和代理商之间共享,则文档也有可选的ForeignKey到代理商或 - 如果没有用户需要链接到文档,您可能想要添加通用关系“所有者”链接到用户或代理商的文档。有关详细信息,请参阅Django documentation on Generic Relations

但是,通用关系有点受限制,因此很难在.filter()和.exclude()查询中使用它们。因此,如果他们不必共享“所有者”或“作者”属性,我建议您链接到不同属性的用户和代理商,...

每个代理商是仅仅引用一个用户还是代理商“分组”多个用户?在这些情况下,请在用户模型中参阅具有ForeignKey的代理商。这意味着,您需要从Django用户模型继承或创建包含您额外定义的变量的用户配置文件。我个人更喜欢这里的第二种选择。有关扩展用户模型的这些和其他选项,请参阅the amazing article on SimpleIsBetterThanComplex,包括很棒的代码示例。

如果用户也可能是多个代理商的一部分,您可以在代理商中使用ManyToMany并保留用户模型。但是,如果您不打算为每个用户设置多个代理,我建议不要使用此选项。

更新1:

根据您的评论,用户只属于一个代理商,但代理机构可能会链接到多个用户。在这种情况下,用户模型应通过ForeignKey链接到代理商。如果管理员用户应该分配代理商,这也很容易管理(至少在Django管理员中),因为管理员用户只需要编辑用户本身(或配置文件)以便将代理商链接到它。

使用post_save信号,您可以检查刚刚保存的用户,如果代理商要求的文件类型(文件模型和代理商处的类型属性(具有或不具有特定选择集的CharField))已链接到用户。如果不是,请创建并链接它。文档模型还应该包含文件字段,以便在文档已经上传时很容易检查。

更新2:

只是为了帮助您,这里是another great article from SimpleIsBetterThanComplex about Django signals