以多用户身份注册

时间:2018-07-10 00:57:09

标签: python django django-rest-framework django-rest-auth

我的应用程序的用例是我将拥有不同类型的用户。他们是:

  • 代理商
  • 代理商
  • 制造商

它们具有自己的种类的属性。

1 用户

2 代理商

  • ID
  • 名字
  • MiddleName
  • 姓氏
  • DOB
  • 性别
  • 地址: 市 街 国家
  • 手机号码
  • 组织

3 代理商

  • ID
  • 名称
  • 地址: 市 街 国家
  • 联系电话(可以添加多个电话号码)
  • 电子邮件
  • 增值税/ PAN号码

4 制造商

  • ID
  • 名称
  • 地址: 市 街 国家
  • 联系电话(可以添加多个电话号码)
  • 电子邮件
  • 增值税/ PAN号码

[注意:代理商有代理商。制造商可能是 与代理商相关联,或者可以直接拥有代理商。 ]

为此,我以这种方式设计了模型

class Agency(models.Model):

    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(
        max_length=200,
        blank=False,
        null=False)
    city = models.CharField(max_length=150, blank=False, null=False)
    street = models.CharField(max_length=150, blank=True, null=True)
    country = models.CharField(max_length=150, blank=True, null=True)
    mobile_number = PhoneNumberField()
    email = models.EmailField(blank=False, null=False)
    vat_number = models.CharField(max_length=40, blank=False, null=False)
agent/models.py

class Agent(models.Model):

    SEX_CHOICE = (
        ('male', 'Male'),
        ('female', 'Female'),
    )
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    agencies = models.ForeignKey(
        Agency,
        related_name="agents",
        on_delete=models.CASCADE)
    manufacturers = models.ForeignKey(
        Manufacturer,
        related_name="agents_manufacturer",
        on_delete=models.CASCADE,
        blank=True,
        null=True)
    first_name = models.CharField(
        max_length=120,
        blank=False,
        null=False)
    middle_name = models.CharField(
        max_length=120,
        blank=True,
        null=True)
    last_name = models.CharField(
        max_length=120,
        blank=False,
        null=False)
    date_of_birth = models.DateField(blank=True, null=True)
    sex = models.CharField(max_length=6, choices=SEX_CHOICE)
    city = models.CharField(max_length=150, blank=False, null=False)
    street = models.CharField(max_length=150, blank=True, null=True)
    country = models.CharField(max_length=150, blank=True, null=True)
    mobile_number = PhoneNumberField()

manufacturer / models.py:

class Manufacturer(models.Model):

    owner = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="manufacturer")
    agency = models.ForeignKey(
        Agency,
        blank=True,
        null=True,
        related_name="agency_manufacturer",
        on_delete=models.CASCADE)
    name = models.CharField(
        max_length=200,
        blank=False,
        null=False)
    city = models.CharField(max_length=150, blank=False, null=False)
    street = models.CharField(max_length=150, blank=True, null=True)
    country = models.CharField(max_length=150, blank=True, null=True)
    mobile_number = PhoneNumberField()
    email = models.EmailField(blank=False, null=False)
    vat_number = models.CharField(max_length=40, blank=False, null=False)

我已使用django-rest-auth进行身份验证。当我转到/rest-auth/registration时,将出现诸如用户名,密码1,密码2之类的字段。但是我需要哪种类型的用户,他/她就是。我该如何处理这种情况?因为,用户应该能够以代理,代理或制造商身份登录。有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

我建议不要使用多个用户模型。这是因为,无论何时需要与用户做某事,您都会在逻辑中引入复杂性。

此外,您将为不同的用户获得相同的ID,并且在处理该问题时会遇到问题。

我建议创建一个自定义的用户模型,并引入一个称为“角色”的东西,它会告诉您它是哪种类型的用户。

然后,您可以将用户配置文件添加到模型中,以根据用户角色添加其他信息。

具有角色属性的用户模型示例:

class MyUser(AbstractUser):
     ROLE_CHOICES = (
         ('A', 'agent'),
         ('G', 'agency'),
         ('M', 'manufacturer'),
    )
    role = models.CharField(max_length=1, choices=ROLE_CHOICES)

对于配置文件,您可以添加称为用户配置文件的OneToOneField(您可以查看django rest文档如何做)。

要进行其他类型的注册,您可以从以下视图开始:

class RegisterView(generics.CreateAPIView):
   role = None
   def perform_create(self, serializer):
        serializer.save(role=role)

然后将其用作不同类型的角色的网址:

urlpatterns = [
    url(r'^agents/', RegisterView.as_view(role='agent'), name="agent_register"),
    url(r'^agencies/', RegisterView.as_view(role='agency'), name="agency_register"),
    url(r'^manufacturers/', RegisterView.as_view(role='manufacturer'), name="manufacturer_register"),
]

答案 1 :(得分:0)

您可以从django.auth.models.User扩展所有模型。或创建自己的用户模型并从中扩展所有模型。

当您要检测用户类型时,请使用以下代码:

if Agent.objects.filter(pk=user.pk).exists():
     # its agent
if Agency.objects.filter(pk=user.pk).exists():
     # its agency
if Manufacturer.objects.filter(pk=user.pk).exists():
     # its manufacturer

要从用户模型扩展模型,只需更新代码,如下所示:

from django.auth.models import User

class Agent(User):
    <same as your example>


class Agency(User):
    <same as your example>


class Manufacturer(User):
    <same as your example>