2010-06-03 152 views
4

是否有可能从Django中的抽象模型继承权限? 我真的无法找到任何有关这方面的信息。对我来说这是行不通的!Django:从抽象模型继承Permssions?

class PublishBase(models.Model): 
    class Meta: 
     abstract = True 
     get_latest_by = 'created' 
     permissions = (('change_foreign_items', 
         "Can change other user's items"),) 

编辑:没有工作意味着它静静地失败。不会创建权限,因为它不会存在于从此类继承的模型上。

+1

“不工作”是指什么?你能详细说明吗? – mawimawi 2010-06-03 11:20:09

+0

请参阅编辑。我找不到任何文档,如果这是应该工作或不... – 2010-06-03 11:26:03

回答

2

这里是链接为您解决问题:http://code.djangoproject.com/ticket/10686 需要应用补丁......但它真的有效。

+0

因为我得到它的权限也应该继承没有这个补丁?(如果没有明确的权限定义在儿童和%(class)s问题) – 2010-06-05 19:37:47

1

我为您的问题编写测试。 我使用django 1.2.1,我有很棒的结果!

如果您想从继承模型向现有模型添加权限,则每次更改它们时都需要运行“syncdb”。 示例100%作品(在无补丁的1.2.1中)

现在可以使用。

alt text http://img203.imageshack.us/img203/7500/permn.png

例子:

from django.db import models 
from django.contrib import admin 

class permissions(models.Model): 
    class Meta: 
     abstract = True 
     permissions = (("test_permission","test permission"),) 


class SomeClass(permissions): 
    name = models.CharField(max_length=255,verbose_name="Name") 

admin.site.register(SomeClass) 
+0

谢谢,很高兴知道它应该像这样工作......所以我必须找出为什么它没有! – 2010-06-05 22:37:18

+0

找出问题所在:如果子类有自己的内部Meta类(它没有定义任何权限),则权限不会被继承! – 2010-06-09 14:24:53

10

的权限不继承,如果子类也定义了自己的class Meta。 我发现下面的变通,这不必定义权限再在每个子模型节省:

class AbstractBaseModel(models.Model): 
    class Meta: 
     abstract = True 
     permissions = (("test_permission","test permission"),) 


class SomeClass(AbstractBaseModel): 
    name = models.CharField(max_length=255,verbose_name="Name") 

    class Meta(AbstractBaseModel.Meta): 
     verbose_name = .... 

无需设置抽象为false子元类,因为Django的设置它的父在处理它时出错! http://docs.djangoproject.com/en/dev/topics/db/models/#meta-inheritance

+0

在Django 1.10.5中,情况仍然如此。已应用此相同的解决方法来获取添加到继承模型的抽象权限,否则makemigrations找不到权限。 – 2017-02-07 14:32:01

2

我的解决方法:

class AbstractModelBase(models.base.ModelBase): 

    def __new__(cls, name, bases, attrs): 
     new = super(AbstractModelBase, cls).__new__(cls, name, bases, attrs) 
     new._meta.permissions += (("abstract_permission", "Abstract permission"),) 
     return new 


class AbstractModel(models.Model): 
    __metaclass__ = AbstractModelBase 

    class Meta: 
     abstract = True 
0

在我的情况下明确地继承Meta并没有因为南的工作。见this ticket

django-admin.py syncdb --all修复了这个问题。

2

看看下面的元执行, 它增加了读取权限到设置MyModelMeta类中的所有Django模型是thier 元类

class MyModelMeta(ModelBase): 
    # add a read permission to each MyModelMeta model 
    def __new__(cls, name, bases, attrs): 

     Meta = None 

     if "Meta" in attrs: 
      Meta = attrs.get("Meta") 
      if hasattr(Meta, "abstract") and getattr(Meta, "abstract"): 
       # if the class is abstract, don't create permissions for it, just return the class object    
       return super(MyModelMeta, cls).__new__(cls, name, bases, attrs) 

     if not Meta: 
      # create a new Meta Class 
      Meta = type('Meta', (object,), {}) 

     setattr(Meta, 'permissions',(("read_%s"%name.lower(), "Can read %s"%name.lower()),)) 
     attrs['Meta'] = Meta 
     return super(MyModelMeta, cls).__new__(cls, name, bases, attrs)   

创建一个抽象Django模型,并设置元类现在

class MyAbstractModel(models.Model): 
    __metaclass__ = MyModelMeta 

    class Meta: 
     abstract=True 

,创建一个普通的Django模型,像这样:memeber到MyModelMeta

class SomeModel(MyAbstractModel): 
    someFieldName = models.CharField(max_length=256, db_index=True) 

这样会生成默认的add/change/delete_somemodel权限,而且还会 它会添加一个新的read_somemodel权限。

如果您还使用南下,用此来产生额外的权限:

from django.db.models import get_app, get_models 
from django.contrib.auth.management import create_permissions 

create_permissions(get_app(app), get_models(), 2 if settings.DEBUG else 0)