python - Django:如何在其自身内部调用相同的模型类?

标签 python python-3.x django python-2.7

我有一个功能 make_fields_permissions我需要在模型类中使用它来解析字段并为每个字段设置权限,例如 [('can_view_first_name_field','can view first name'),...]

  • 目标 我需要调用并覆盖 Person类和内部自我
  • 我试过
  • 
    def __init__(self,*args, **kwargs):
        self.Meta.permissions = make_fields_permissions(self.model)
        super().__init__(*args, **kwargs)
    
    
  • 我的代码看起来像这样
  • from django.db import models
    
    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
    
        def __init__(self, *args, **kwargs):
            # kwargs['user']['permissions'] =  make_fields_permissions(Profile)
            # x = self['age']
            super().__init__(*args, **kwargs)
    
    
        class Meta:
            permissions = make_fields_permissions(Person) #< I can't use the same model inside meta
    
    

    最佳答案

    您的目标如下:

  • 目标 X (真正的目标):根据模型字段动态创建权限
  • 目标 Y (将实现X的感知目标):创建模型类时调用它。

  • Note: See What is the XY problem?


    让我们先讨论目标 Y 以及为什么它太复杂,而且有些不可行。当想要自定义类的创建方式时,可以使用 metaclasses ,乍一看,这似乎是满足您需求的完美解决方案(事实上,如果您确实创建了一个正确的解决方案,那就是)。但这里的问题是 Model已经有一个元类是 ModelBase它已经在做很多事情,而且有点复杂。如果我们想要一个自定义元类,我们需要从它继承并非常仔细地围绕它的实现来做我们想做的事情。此外,制作它并不是故事的结局,因为那样我们就需要维护它,因为它很容易被 Django 更新破坏。因此 目标 Y 不可行。
    转到实际 目标 X 要做到这一点,可以 Programmatically create permissions [Django docs] .执行此操作的一个好地方是在应用程序配置中 ready方法。对于使用 startapp 创建的所有应用程序有一个 apps.py具有从 AppConfig 继承的 appconfig 的文件, 当模型加载时它的 ready方法被调用。因此,此方法用于执行各种任务,例如附加信号、各种设置,例如任务等。修改应用程序的 appconfig 以编程方式创建权限,如下所示:
    from django.apps import AppConfig
    
    
    class YourAppConfig(AppConfig):
        default_auto_field = 'django.db.models.AutoField' # Don't modify, keep it as it is in your code
        name = 'your_app' # Don't modify, keep it as it is in your code
        
        def ready(self):
            from django.contrib.auth.models import Permission
            from django.contrib.contenttypes.models import ContentType
            from path.to import make_fields_permissions
            from .models import Person
            # import models here, not outside as models may not be loaded yet
            content_type = ContentType.objects.get_for_model(Person)
            for codename, name in make_fields_permissions(Person):
                Permission.objects.get_or_create(
                    codename=codename, # 'can_view_first_name_field'
                    name=name, # 'can view first name'
                    content_type=content_type,
                )
    

    关于python - Django:如何在其自身内部调用相同的模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67858169/

    相关文章:

    python - 将字符串列表转换为函数调用

    c - 如何使用套接字将数据从 python 发送到 C (unix)

    django - 在 ModelForm 中使用 `SplitArrayField` 而不是 `SimpleArrayField`

    python - iPython 和 R 之间的 GLM 结果差异

    python - 如何在python子进程中指定图像输出的尺寸?

    Python:将查询字符串分解为关联数组不起作用

    python - 实现数值求解微分方程的初始条件

    python - 如何使用 python 检索命令行上显示的输出?

    django - 如何配置 VS Code 以使用 Prettier HTML 格式化程序?

    javascript - Google map API 错误 : This API key is not authorized to use this service or API. 地点 API 错误:ApiTargetBlockedMapError