2016-01-21 71 views
1

我正在进入Django,我正在使用DRF来建立一个宁静的API,但我有4个不同的用户 管理员,他有权访问管理面板 经纪人谁可以在网站上做任何事情,但无法访问管理面板 买家谁只能做2动作买进并在中间,谁可以做一切,除了一件事 我现在正在做的方式是我的基类与用户之间在django中处理3个不同的用户+ admin用户?

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个不同的领域和与用户模型的onetoone关系的其他模型

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

如果所有的用户类有特殊的领域,那么也许你的方法并不是那么糟糕,但你可以尝试这种方法,在使用某种额外的领域时,可以存储与这些特殊领域相关的数据。例如:

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创建多个表。和保存mechanisom很简单: 从myapp.models进口部经理

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

抱歉,我意识到一些错误代码 – isaac

0

我觉得你可以在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) 
+0

我忘了这个添加到代码,但每个用户有一个特殊的领域 – isaac

相关问题