在我的项目中,我必须处理不同类型的用户,例如客户和雇主。每种类型的用户都有自己的字段和权限:客户可以购买东西,而雇主则不能。
我已阅读过Django文档,看起来有两种选择:
AbstractUser
类进行Costumize并添加所有客户和雇主的字段。然后使用权限系统授予/撤消权限或为每种类型的用户创建一个组。这里的缺点是有未使用的字段。采用代理模型:
这种情况似乎更合理,但我不知道如何处理权限。考虑我想使用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系统更合法。
所以最后,处理这种情况的最佳方法是什么?
答案 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
的实例可能都是。
关于权限,我觉得这是一个单独的问题;我建议你最后排序。如果您选择的设计接近现实并且您可以使用这些功能;添加自定义权限非常简单。