这是我的models.py:
class Item(models.Model):
# ... some irrelevent fields ...
tags = models.ManyToManyField('Tag')
class Tag(models.Model):
name = models.CharField(max_lenght=30)
category_id = models.IntegerField()
标签实际上是一个通用名称。每个项目都有许多不同类型的标签——目前有四种类型:团队标签、主题标签、管理员标签和特殊标签。最终可能还会有更多。
想法是,它们都具有基本相同的字段,因此不是像 4 个具有多对多关系的表,也不是在添加新类型时为 Item 添加新列,而是将所有内容称为“标签”,并且很容易添加新类型而不对架构进行任何更改。
现在要在 admin.py 中处理这个问题,我正在使用动态创建的代理模型(基于this),如下所示:
def create_modeladmin(modeladmin, model, name = None):
class Meta:
proxy = True
app_label = model._meta.app_label
attrs = {'__module__': '', 'Meta': Meta}
newmodel = type(name, (model,), attrs)
admin.site.register(newmodel, modeladmin)
return modeladmin
class TagAdmin(models.Model):
def queryset(self):
return self.model.objects.filter(category_id = self.cid)
class TeamAdmin(TagAdmin):
cid = 1
class SubjectAdmin(TagAdmin):
cid = 2
# ... and so on ...
create_modeladmin(TeamAdmin, name='Teams', model=Tag)
create_modeladmin(SubjectAdmin, name='Subject', model=Tag)
#... and so on ...
这对我很有用。但是,不同的员工需要不同的编辑权限——一个人不应该访问管理员标签,而另一个人应该只能编辑主题标签和团队标签。但就管理站点而言 - 动态模型不存在于权限列表中,我不能授予任何人关于它们的权限。
即,获得列表上所有权限的用户仍然无权编辑任何动态模型,让任何人访问它们的唯一方法是给他一个超级用户,这显然违背了这一点
我搜索了 SO 和网络,我找不到任何有类似问题的人,而且文档没有在动态模型部分或代理模型部分中对此没有任何说明。所以我猜这是一个不同的问题。任何帮助将不胜感激
更新
所以经过一番研究,答案很简单。由于 django 中的权限是保存到数据库中的对象,所以我需要做的很简单 - 将相关权限(并创建新的 ContentType 对象)添加到数据库,然后我可以给人们特定的权限。
但是,这提出了一个新问题 - 将创建权限的函数放在 create_modeladmin 中作为 find_or_create 类型的函数(基本上每次都运行)是一个好的约定,还是应该将它用作我应该运行一次的外部脚本每次我添加一个新的动态模型(有点像 syncdb 是怎么做的)?
有没有办法动态地创建权限(在我看来,这似乎是理想和最合适的解决方案)?