注册为多个我们

2024-05-18 23:41:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 代理人
  • 代理
  • 制造商

他们有自己的特点。你知道吗

1用户

2代理

  • 身份证
  • 名字
  • 中间名
  • 姓氏
  • 出生日期
  • 地址: 城市 街道 国家
  • 手机号码
  • 组织

3机构

  • 身份证
  • 姓名
  • 地址: 城市 街道 国家
  • 联系电话(可以添加多个号码)
  • 电子邮件
  • 增值税/税号

4制造商

  • 身份证
  • 姓名
  • 地址: 城市 街道 国家
  • 联系电话(可以添加多个号码)
  • 电子邮件
  • 增值税/税号

[注:代理商有代理商。制造商可能是 与代理机构有关联或可以直接有代理机构。]你知道吗

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

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()

制造商/型号.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像username,password1,password2这样的字段就会出现。但是我需要哪种类型的用户,他/她也是。我如何处理这种情况?因为,用户应该能够以代理或代理或制造商的身份登录。有人能帮我吗?你知道吗


Tags: namefalsetrue代理onmodelsdeletenull
2条回答

我建议不要使用多个用户模型。这是因为,无论您在哪里需要对用户进行操作,您都会将复杂性引入到您的逻辑中。你知道吗

此外,您将为不同的用户获得相同的id,并且您将遇到一些问题来处理它。你知道吗

我建议您创建一个自定义用户模型,并引入一个名为“角色”的东西,它将告诉您它是什么类型的用户。你知道吗

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

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

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

对于概要文件,可以添加一个名为user profile的OneToOneField(可以查看django rest文档how do)。你知道吗

要进行不同类型的注册,可以从以下视图开始:

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"),
]

您可以从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>

相关问题 更多 >

    热门问题