Django有自带的Group模型,但和User模型一样,自带的Group模型也无法满足我的项目需求。
给Group模型增加field
比如要给Group增加一个field叫type,用于区分group的类型,可以通过如下方法增加。
if not hasattr(Group, 'type'):
field = models.CharField(max_length=64, verbose_name="type", null=True, default=GroupType_enum.department.value, blank=False,choices=GroupType_enum.choices)
field.contribute_to_class(Group, 'type')
增加完后要进行数据库迁移。
给Group模型增加function
可以通过代理的方式给Group增加function
class Group(Group):
class Meta:
proxy = True
def all_departments():
return Group.objects.filter(type=GroupType_enum.department.value)
重新定义Group这个model,继承自系统的Group model,设置proxy=true指定这个新的model为代理。新定义的代理Group和系统的Group就会共用一个数据库表了。
代理的model只能定义 function,不能定义新的field。
要注意的是,在项目的其他地方要用到Group的地方,要import这个新定义的Group,而不是Import系统的Group。因为系统的Group并没有被改变,不能访问这个代理Group定义的function。
有人可能会问代理系统的Group后为什么还叫Group,换个名字不好吗,比如MyGroup?
答案:可以使用其他名字,但是在使用权限模型guardian的时候,guardian只认User和Group这两个类名,换了名字之后无法设置组权限了。