【问题标题】:dealing with 3 different user + admin user in django?在 django 中处理 3 个不同的用户 + 管理员用户?
【发布时间】:2016-04-27 06:28:37
【问题描述】:

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

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

那么你们认为最好的处理方法是什么?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      我认为您可以在 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)
      

      【讨论】:

      • 我忘了把这个添加到代码中,但是每个用户都有一个特殊的字段
      猜你喜欢
      • 2011-03-31
      • 2012-08-07
      • 2018-02-09
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2012-02-16
      相关资源
      最近更新 更多