2017-02-20 41 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)。