首页 > 解决方案 > AttributeError:模块“django.db.models”没有属性“get_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)

标签: pythondjangodjango-models

解决方案


这是一个 AttributeError,因为 models.get_model() 在 Dango 1.9 中被删除了。你应该使用 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。

我不确定我是帮助你还是让你困惑。对不起,如果我后来做了。

最良好的祝愿。


推荐阅读