为User模型定义两个不同的扩展

时间:2011-03-18 18:52:14

标签: python django

class CustomerProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    gender = models.CharField(max_length=1,blank=True)
    zip_code = models.IntegerField()

class StoreProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    phone_number = models.IntegerField()

我希望能够以“商店”或“客户”的身份登录/验证用户身份。

  1. 有没有办法让这项工作与上述模型一起使用?

  2. 我还将查看@login_required装饰器,以区分登录的商店和客户。关于如何进行的任何建议?

3 个答案:

答案 0 :(得分:2)

AFAIK无法做到这一点。但你可以试试这个:

class UserProfile(models.Model):
    user = ForeignKey(User, unique=True)
    store = OneToOneField(Store, blank=True, null=True)
    customer = OneToOneField(Customer, blank=True, null=True)

并在为用户创建配置文件时仅设置storecustomer中的一个。

答案 1 :(得分:2)

  

我希望能够以“商店”或“客户”的身份登录/验证用户。

     

有没有办法让这项工作与上述模型一起使用?

是的,但是。

http://docs.djangoproject.com/en/1.2/topics/auth/#storing-additional-information-about-users

如果要使用自动功能,可以获得与用户关联的一个(单个)Profile类对象。

如果您不想使用自动配置文件功能,它将正常工作。您将无法使用AUTH_PROFILE_MODULE设置或get_profile()方法 一个User。你将被迫写很多

try:
    CustomerProfile.objects.get( user=request.user )
except CustomerProfile.DoesNotExist:
    # hmmm.  Must be a Store, not a Customer.

这不是太糟糕,因为它主要是一个通用函数来获取相关的 简介“艰难的道路”。

  

我还将查看@login_required装饰器,以区分登录的商店和客户。关于如何进行的任何建议?

  1. 为每个类添加save()方法,检查对象对象是否存在。如果您尝试为User创建CustomerProfile,CustomerProfile.save()将检查StoreProfile并引发异常(如果存在)。

    这两种关系是排他性的。您需要在各种型号中确保这一点。

  2. 写两个装饰,你会更开心。它们有相当多的重叠,但编写许多简单的无参数装饰器比编写超级装饰器更好。

    @customer_required@store_required。每个人都会执行@login_required所做的事情以及确定与用户的哪些关系有记录。 customer_required必须检查与User的CustomerProfile关系。 store_required检查与用户的StoreProfile关系。


  3. http://docs.djangoproject.com/en/1.2/topics/auth/#groups

    另一方面,您在Django中定义了组。我建议你使用组和组名,而不是试图拥有像这样的超级花哨的配置文件。

    拥有一个包含所有属性的“主”配置文件。

    使用Django Group表定义各种角色(“用户”,“存储”)并正确地将用户分配到组。

    然后检查@store_required和@customer_required授权装饰器中的组名。

答案 2 :(得分:0)

如何使用新的外表扩展用户模型不需要改变你的方法 - 所以这很好。

解决这个问题的一种方法是使用login_required逻辑,还可以在创建用户时为用户分配Django身份验证权限 - 一个用于存储,一个用于客户。否则,你可以编写一个实用程序函数来根据它们在外表中的存在来确定它们的成员资格。有关详细信息,请参阅http://docs.djangoproject.com/en/dev/topics/auth/