2017-02-20 42 views
0

嗨,有可能是模型有一个ManyToManyField与所有可用的应用程序作为其选择?Django多对多可用app_labels现场

比方说,我在我的settings.py在INSTALLED_APPS这些应用

然后在我的models.py我有这个模型

class IPAddreses(models.Model): 
    ip = models.GenericIPAddressField() 
    apps = models.ManyToManyField(ContentType, blank=True) 
    # The apps field should be the choices of the avialable apps on the settings.py 

这可能吗?

+0

出于好奇,你的用例是什么? – Udi

+0

要启用IPAddress白名单上的每个应用程序认证 –

+0

另请参阅:https://docs.djangoproject.com/en/1.10/topics/auth/default/#programmatically-creating-permissions – Udi

回答

1

可能不可能,但您可以做的只是使用已安装应用程序列表更新的新模型/表格,并为该模型添加多对多关系。 这将是一个更简单,更灵活的解决方案。 由于您可能会跟踪(如果需要)与从已安装的应用程序列表中删除的应用程序的关系。

+0

感谢您的解决方案虽然..但作为尽可能我会避免这种情况,因为它几乎是一个硬编码的解决方案 –

+1

欢迎您,但它不一定是硬编码的。您可以在settings.py代码的末尾轻松添加一些python代码,以便每次重新启动应用程序时运行它,以便每次应用程序列表发生更改时都会运行该代码。在该代码中,您只需从安装的列表中查找表中缺少的应用程序并将它们添加到表中,并且还可以查找表中存在的任何不存在于已安装列表中的行,以删除它们或者只是将它们标记为逻辑删除。 – spilafis

1

可能的解决方案:

# models.py 
class IPAddressApp(models.Model): 
    ip = models.GenericIPAddressField() 
    app = models.CharField(max_length=100) 

    class Meta: 
     unique_together = (
      ("ip", "app"), 
     ) 

# forms.py 
from django.apps import apps 

class IPAddressAppForm(forms.ModelForm): 
    app = forms.ChoiceField() 

    class Meta: 
     model = models.IPAddressApp 
     fields = (
      'ip', 
      'app', 
     ) 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['app'].choices = self.get_apps() 

    def get_apps(self): 
     return [(app, "{} ({})".format(config.verbose_name, app)) for 
       app, config in apps.app_configs.items()] 

其他选项:

  • 对于许多到许多领域,使用一个App模型,并使用上面的代码的应用程序的ready()方法填充它。
  • 对于应用程序使用ArrayField(CharField)Postgresql only)。