2017-02-20 5 views
0

モデルにManyToManyFieldがあり、使用可能なすべてのアプリケーションを選択肢として持つことが可能ですか?利用可能なapp_labelsのDjango多対多のフィールド

のは

はその後、私の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 

ことが可能ですを持って、私は私のsettings.pyにINSTALLED_APPSにこれらのアプリを持っているとしましょうか?

+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)を使用してください。
関連する問題