在Django中设计webapp的想法

时间:2011-01-19 21:23:17

标签: python django web-applications

我正在使用Django中基于用户的社交网络类型的Web应用程序。这是我的第一个,所以我想确保我使用一些好的做法。

目前,该网络应用支持两种用户。这由两个不同的组表示。当我注册用户时,我将它们分配给这两个组中的一个。我还有两个应用程序,每个类型的用户一个。应用程序处理与特定类型的用户不同的任何事物。我有另一个处理实际身份验证的应用程序。这个应用程序使用Django的内置用户类型,并为他们分配一个UserProfile。两种不同类型的用户拥有自己的配置文件,这些配置文件从UserProfile扩展/继承。

这种方法运行得相当好,并且相当可重用,因为身份验证应用程序可以从URL中提取用户类型并确定要创建的用户类型。由于这些组被方便地命名,因此它们也可以添加到正确的组中。

  1. 这是最好的方法,还是有更优选的,经过验证的方法来处理这个问题?这似乎是一个相当普遍的场景。如果我不需要,我不想继续错误地重新发明轮子。
  2. 我正在考虑添加另一个名为common的应用程序,或者可以处理所有用户共有的内容的应用程序。例如,查看用户个人资料页面可能是任何登录的人可能想要做的事情,无论他们是什么类型的用户。
  3. 谢谢!

1 个答案:

答案 0 :(得分:2)

简单的第一部分,2)你的位置。这将是最简单,最有效的方法。它是有意义的,而不是跨两个应用程序复制功能,以便有一个应用程序来处理两种用户类型共有的事情。

回到1)

如果两个配置文件都从UserProfile扩展,那么你会遇到一个问题(如果你在User对象上使用get_profile() - 请参阅http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users)你只得到一个UserProfile对象,而不是根据收到的对象知道用户实际属于哪个组。这是因为它们都扩展了UserProfile,但是UserProfile不能(我相信)是抽象的,因为你希望每个用户都有一个指向UserProfile对象的指针,该对象实际上可能是UserGroup1或UserGroup2对象。

我建议你做的是制作两个独立的模型,这些模型不会从同一个模型扩展(出于必要性):Group1和Group2。您将在User对象的UserProfile中存储两个配置文件共有的信息。然后在UserProfile中,您将拥有Group1和Group2对象的ForeignKey:

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

你必须自己进行逻辑检查,以确保只有一个是有效的(你可以在重写的save()方法或其他东西中执行此操作),然后立即获取所有用户的数据,并且知道他们在哪个群组你可以做以下事情:

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

只有一个数据库查询会为您提供有关用户所需的所有信息,并且您还知道他们所在的组(不是'无')。

我希望有所帮助。

P.S。我假设这样的组不仅具有彼此独特的数据,而且还具有独特的功能。