Django网页应用的设计思路

2 投票
1 回答
1296 浏览
提问于 2025-04-16 10:16

我正在用Django开发一个基于用户的社交网络类型的网页应用。这是我第一次做这样的项目,所以我想确保我使用了一些好的做法。

目前这个网页应用支持两种用户。这通过两个不同的用户组来表示。当我注册一个用户时,会把他们分配到这两个组中的一个。我还有两个应用程序,每种用户对应一个。这些应用处理特定用户类型的独特功能。我还有一个应用专门处理用户的登录和认证。这个应用使用Django内置的用户类型,并为他们分配一个用户资料。两种不同类型的用户都有自己的资料,这些资料是从用户资料(UserProfile)继承而来的。

这个方法运行得还不错,而且相对可重用,因为认证应用可以从网址中获取用户类型,进而确定要创建哪种类型的用户。由于这些组的命名很方便,它们也能被添加到正确的组里。

  1. 这样做是最好的方法吗?还是有其他更好、更可靠的处理方式?这似乎是一个相当常见的场景。如果可以的话,我不想继续错误地重复造轮子。
  2. 我在考虑再加一个叫“公共”的应用,或者其他什么名字,用来处理所有用户共有的功能。例如,查看用户的个人资料页面可能是任何登录用户都想做的事情,无论他们是什么类型的用户。

谢谢!

1 个回答

2

先说简单的部分,关于第二点,你说得很对。这确实是最简单有效的方法。与其在两个应用中重复相同的功能,不如有一个应用来处理这两个用户类型共有的内容,这样更合理。

回到第一点。

如果两个用户档案都是从UserProfile扩展而来的,你会遇到一个问题:如果你在一个用户对象上使用get_profile()(可以参考这个链接),你得到的只是一个UserProfile对象,而不知道这个用户实际上属于哪个组。这是因为它们都扩展自UserProfile,但UserProfile不能是抽象的,因为你希望每个用户都有一个指向UserProfile对象的指针,而这个指针可能实际上是UserGroup1或UserGroup2的对象。

我建议你创建两个独立的模型,分别是Group1和Group2,它们不需要从同一个模型扩展。你可以把两个档案共有的信息存储在用户对象的UserProfile中。然后在UserProfile中,你可以有一个外键,分别指向Group1和Group2的对象:

group1 = models.ForeignKey(Group1, blank=True, null=True)

你需要自己处理逻辑检查,以确保只有一个是有效的(你可以在重写的save()方法中处理这个逻辑),但这样一来,你就可以一次性获取用户的所有数据,并且知道他们属于哪个组。你可以这样做:

User.objects.filter(username='blahblah').select_related('profile', 'profile__group1', 'profile__group2')

只需一次查询数据库,就能获取到关于用户的所有信息,同时你也能知道他们属于哪个组(那个不是'None'的组)。

希望这能帮到你。

附言:我假设这些组之间不仅有独特的数据,还有独特的功能。

撰写回答