我的应用程序的用例是我将拥有不同类型的用户。他们是:
它们具有自己的种类的属性。
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()
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之类的字段。但是我需要哪种类型的用户,他/她就是。我该如何处理这种情况?因为,用户应该能够以代理,代理或制造商身份登录。有人可以帮我吗?
答案 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>