AttributeError:模块'django.db.models'没有属性'get_models'

时间:2019-07-29 10:17:15

标签: python django django-models

为什么在调用get_model()函数时遇到问题?这是我正在尝试做的事情:

@classmethod
    def get_content_models(cls):
        """
        Return all Package subclasses.
        """
        is_content_model = lambda m: m is not Package and issubclass(m, Package)
        return list(filter(is_content_model, models.get_models()))

以前曾经可以使用,但是现在更新到新的Django之后,它会引发错误。该如何解决?

更新

下面是我的模特

from django.db import models

class Package(BasePackage):
    """
    A package in the package tree. This is the base class that custom content types
    need to subclass.
    """

    parent = models.ForeignKey("Package", blank=True, null=True, related_name="children", on_delete=models.CASCADE)
    titles = models.CharField(editable=False, max_length=1000, null=True)
    content_model = models.CharField(editable=False, max_length=50, null=True)
    in_menus = MenusField(_("Show in menus"), blank=True, null=True)
    login_required = models.BooleanField(_("Login required"), default=False,
                                         help_text=_("If checked, only logged in users can view this Package"))
    itinerary = models.ManyToManyField('ItineraryItem', through="PackageItinerary")


    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        """
        Create the titles field using the titles up the parent chain
        and set the initial value for ordering.
        """
        if self.id is None:
            self.content_model = self._meta.object_name.lower()
        self.titles = self.title
        super(Package, self).save(*args, **kwargs)

    @classmethod
    def get_content_models(cls):
        """
        Return all Package subclasses.
        """
        is_content_model = lambda m: m is not Package and issubclass(m, Package)
        return list(filter(is_content_model, models.get_models()))

    def get_content_model(self):
        """
        Provies a generic method of retrieving the instance of the custom
        content type's model for this Package.
        """
        return getattr(self, self.content_model, None)

2 个答案:

答案 0 :(得分:2)

这是AttributeError,因为在Dango 1.9中删除了models.get_model()。 您应该使用dango.apps.apps.get_model()。 一些讨论是herehere

这是您现在的使用方式。

from django.apps import apps
MyModel = apps.get_model('app name where the model is','name of the model you want to get from that app')
# Do your logic here with MyModel

但是,如果您只想获取模型,为什么不立即将其导入?您如何在下游使用代码?请注意,由于更改(从1.9开始),函数的属性可能已更改。因此,您可能需要考虑最新的模块和功能来实现您的结果(以前使用过的结果)。这意味着您需要进行更多工作才能与更高版本的Django保持同步,但是由于get_model的更改,您仍然可能会遇到问题。 总而言之,请查看代码在做什么,并适应新版本的Django。

我不确定我是帮助过您还是使您感到困惑。抱歉,如果我以后再做。

最良好的祝愿。

答案 1 :(得分:0)

from django.apps import apps

ModelClass = apps.get_model('app_name.ModelClass')

您现在可以实例化此类

mc = ModelClass()

Doc here