在Django中处理多种类型用户的最佳方法

时间:2016-02-08 09:47:22

标签: python django

在我的项目中,我必须处理不同类型的用户,例如客户雇主。每种类型的用户都有自己的字段和权限:客户可以购买东西,而雇主则不能。

我已阅读过Django文档,看起来有两种选择:

  1. AbstractUser类进行Costumize并添加所有客户和雇主的字段。然后使用权限系统授予/撤消权限或为每种类型的用户创建一个组。这里的缺点是有未使用的字段。
  2. 采用代理模型

    
    from django.contrib.auth.models import User
    from django.db import models

    class Costumer(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)

    class Meta:
        db_table = 'costumers'
        permissions = (
            ("access_this", "User may access this"),
        )
        ordering = []
    

    class Employee(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)

    class Meta:
        db_table = 'employers'
        permissions = (
            ("access_that", "User may access that"),
        )
        ordering = []
    

    class Meta: db_table = 'costumers' permissions = ( ("access_this", "User may access this"), ) ordering = []

    这种情况似乎更合理,但我不知道如何处理权限。考虑我想使用class Meta: db_table = 'employers' permissions = ( ("access_that", "User may access that"), ) ordering = [] 而不是检查类型(如果用户有特定字段),因为它似乎对Django系统更合法。

  3. 所以最后,处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

第一种解决方案要好得多。

  

这里的缺点是有未使用的字段。

我不同意这一点,你不必存储User模型中的所有字段。另外,如果您正在谈论5个领域,那并不重要。

你可以扩展AbtractUser并使用一些构图;你不必把所有的字段放在那里:

class User(AbstractUser):
     email = ...
     ...
     # for the employer, let's say you want to save the company details
     company = models.ForeignKey('myapp.Company', null=True, blank=True)
     ...
     # for the customer
     customer_details = models.ForeignKey('...')

通过这种方式,您可以记录user_type,如果您想要或从外键中推断出类型(如果有公司,那么它就是雇主)。

为了帮助您更好地使用该模型,我需要了解您的应用程序中雇主与客户的区别。请注意,使用该解决方案,User的实例可能都是。

关于权限,我觉得这是一个单独的问题;我建议你最后排序。如果您选择的设计接近现实并且您可以使用这些功能;添加自定义权限非常简单。