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

时间:2016-01-21 06:06:41

标签: django django-models django-admin

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

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-我一直在寻找创建我自己的抽象基类用户模型,然后使用该模型作为我的用户模型并使用admin用户的管理面板。

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

所以你们认为最好的办法是什么?

2 个答案:

答案 0 :(得分:0)

我认为你可以添加一个字段" type"在siteuser中你并没有创建3个模型"经理,买家,卖家"

class siteuser(models.Model):
    USER_CHOICE = (
        (1, 'manger'),
        (2, 'buyer'),
        (3, 'seller'),
    )
    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()
    type = models.ChoiceField(choices=USER_CHOICE)

答案 1 :(得分:0)

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

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

   ...

因此,您无需为managerbuyerseller创建多个表格。节省机制很简单:      来自myapp.models导入管理器

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