Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django多对多字段,带有可用的应用程序标签_Python_Django - Fatal编程技术网

Python Django多对多字段,带有可用的应用程序标签

Python Django多对多字段,带有可用的应用程序标签,python,django,Python,Django,嗨,一个模特有可能拥有一个包含所有可用应用程序的ManyToManyField作为其选择吗 假设我在我的settings.py中安装了这些应用程序 然后在我的模型中,我有这个模型 class IPAddreses(models.Model): ip = models.GenericIPAddressField() apps = models.ManyToManyField(ContentType, blank=True) # The apps field should b

嗨,一个模特有可能拥有一个包含所有可用应用程序的ManyToManyField作为其选择吗

假设我在我的settings.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

可能吗?

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

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

可能的解决方案:

# 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()]
其他选择:

  • 对于多对多字段,使用
    应用程序
    模型,并使用应用程序方法上的上述代码填充它
  • 对应用程序使用
    ArrayField(CharField)
    ()
    • 可能的解决方案:

      # 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()]
      
      其他选择:

      • 对于多对多字段,使用
        应用程序
        模型,并使用应用程序方法上的上述代码填充它
      • 对应用程序使用
        ArrayField(CharField)
        ()

      不过,感谢您提供的解决方案。。但我会尽量避免,因为这几乎是一个硬编码的解决方案,你是受欢迎的,但它不必硬编码。您可以轻松地在settings.py代码的末尾添加一些python代码,这样每次重新启动应用程序时它都会运行,每次应用程序列表更改时它都会运行。在该代码中,您只需从表中缺少的已安装列表中查找应用程序并将其添加到表中,您也可以查找表中不存在的任何应用程序来删除它们,或将它们标记为逻辑删除。不过,感谢您提供了此解决方案。。但我会尽量避免,因为这几乎是一个硬编码的解决方案,你是受欢迎的,但它不必硬编码。您可以轻松地在settings.py代码的末尾添加一些python代码,这样每次重新启动应用程序时它都会运行,每次应用程序列表更改时它都会运行。在该代码中,您只需从表中缺少的已安装列表中查找应用程序并将其添加到表中,您还可以查找表中不存在的任何应用程序来删除它们,或将它们标记为逻辑删除。出于好奇,您的使用情形是什么?要在每个应用程序身份验证上启用IPAddress白名单,请参见:出于好奇,您的使用情形是什么?要在每个应用程序身份验证上启用IPAddress白名单,请参见: