我正在使用Django中基于用户的社交网络类型的Web应用程序。这是我的第一个,所以我想确保我使用一些好的做法。
目前,该网络应用支持两种用户。这由两个不同的组表示。当我注册用户时,我将它们分配给这两个组中的一个。我还有两个应用程序,每个类型的用户一个。应用程序处理与特定类型的用户不同的任何事物。我有另一个处理实际身份验证的应用程序。这个应用程序使用Django的内置用户类型,并为他们分配一个UserProfile。两种不同类型的用户拥有自己的配置文件,这些配置文件从UserProfile扩展/继承。
这种方法运行得相当好,并且相当可重用,因为身份验证应用程序可以从URL中提取用户类型并确定要创建的用户类型。由于这些组被方便地命名,因此它们也可以添加到正确的组中。
谢谢!
答案 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。我假设这样的组不仅具有彼此独特的数据,而且还具有独特的功能。