处理3个不同的用户+;django中的管理员用户?

处理3个不同的用户+;django中的管理员用户?,django,django-models,django-admin,Django,Django Models,Django Admin,我正在进入django,我正在使用drf构建一个restful api,但我有4个不同的用户 管理员,他可以访问管理员面板 可以在站点上执行任何操作但无法访问管理面板的代理 只能执行两个操作的买家购买和搜索 中间的人,除了一件事外,什么都能做。 我现在的做法是,我有一个基类,其中包含用户之间的所有共享字段 class siteuser(models.Model): name = models.CharField( max_length=255, null=False, bl

我正在进入django,我正在使用drf构建一个restful api,但我有4个不同的用户 管理员,他可以访问管理员面板 可以在站点上执行任何操作但无法访问管理面板的代理 只能执行两个操作的买家购买和搜索 中间的人,除了一件事外,什么都能做。 我现在的做法是,我有一个基类,其中包含用户之间的所有共享字段

class siteuser(models.Model):   
    name = models.CharField(
    max_length=255, null=False, blank=False, db_index=True)
    email = models.EmailField(max_length=254, unique=True)
    address = models.CharField(max_length=255, null=False, blank=False)
    city = models.CharField(max_length=254, null=False, blank=False)
    active = models.BooleanField(default=1)
    about = models.TextField()

    class Meta:
        abstract = True
然后我有另外3个模型,它们具有不同的字段和与用户模型的一对一关系

class manger(siteuser):
    manger = models.OneToOneField(settings.AUTH_USER_MODEL)
    manager_licsences_number = models.IntegerField()

class buyer(siteuser):
   buyer = models.OneToOneField(settings.AUTH_USER_MODEL)

class seller(siteuser):
   seller = models.OneToOneField(settings.AUTH_USER_MODEL)
   trust_number = models.IntegerField()
但我觉得这种方法是错误的,我不得不在脑子里想一些想法

1-我一直在寻找创建自己的抽象基类用户模型,然后使用该模型作为我的用户模型,并使用管理员用户的管理面板

2-将用户模型抽象3次,创建3个用户对象,为三个不同的用户创建自定义誓言,我认为这不是一个好方法


那么,你们认为什么是处理这个问题的最佳方法呢?

我认为你们可以在siteuser中添加一个字段“type”,而不必创建3个模型“manager,buyer,seller”


我认为您可以在siteuser中添加一个字段“type”,而不必创建3个模型“manager、buyer、seller”


如果所有的用户类都有特殊字段,那么你的方法可能不是那么糟糕。但是你可以尝试这种方法,使用某种额外的字段,你可以存储与这些特殊字段相关的数据。例如:

class siteuser(models.Model):
    broker = models.OneToOneField(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length = 255, null = False, blank = False, db_index = True)
    email = models.EmailField(max_length = 254, unique = True)
    address = models.CharField(max_length = 255, null = False, blank = False)
    city = models.CharField(max_length = 254, null = False, blank = False)
    active = models.BooleanField(default = 1)
    about = models.TextField()
    extra_field = models.CharField(max_length=255, null=True)  #For special data

class manager(siteuser):
    class Meta:
       proxy = True

    @property
    def manager_licsences_number(self):
         return self.extra_field

    @manager_licsences_number.setter
    def manager_licsences_number(self, value):
        self.extra_field = value

   ...
因此,您不需要为
经理
买方
卖方
创建多个表。保存机制很简单: 从myapp.models导入管理器

 m = manager()
 m.manager_licsences_number = '1-22-33-4'
 ..
 m.save()
 print(m.manager_licsences_number)

如果所有的用户类都有特殊字段,那么你的方法可能不是那么糟糕。但是你可以尝试这种方法,使用某种额外的字段,你可以存储与这些特殊字段相关的数据。例如:

class siteuser(models.Model):
    broker = models.OneToOneField(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length = 255, null = False, blank = False, db_index = True)
    email = models.EmailField(max_length = 254, unique = True)
    address = models.CharField(max_length = 255, null = False, blank = False)
    city = models.CharField(max_length = 254, null = False, blank = False)
    active = models.BooleanField(default = 1)
    about = models.TextField()
    extra_field = models.CharField(max_length=255, null=True)  #For special data

class manager(siteuser):
    class Meta:
       proxy = True

    @property
    def manager_licsences_number(self):
         return self.extra_field

    @manager_licsences_number.setter
    def manager_licsences_number(self, value):
        self.extra_field = value

   ...
因此,您不需要为
经理
买方
卖方
创建多个表。保存机制很简单: 从myapp.models导入管理器

 m = manager()
 m.manager_licsences_number = '1-22-33-4'
 ..
 m.save()
 print(m.manager_licsences_number)

我忘了将其添加到代码中,但每个用户都有一个特殊字段我忘了将其添加到代码中,但每个用户都有一个特殊字段