我正在进入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个用户对象并为三个不同的用户建立自定义誓言,我认为这不是一个好方法
所以你们认为最好的办法是什么?
答案 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
...
因此,您无需为manager
,buyer
,seller
创建多个表格。节省机制很简单:
来自myapp.models导入管理器
m = manager()
m.manager_licsences_number = '1-22-33-4'
..
m.save()
print(m.manager_licsences_number)