为什么在调用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)
答案 0 :(得分:2)
这是AttributeError,因为在Dango 1.9中删除了models.get_model()。 您应该使用dango.apps.apps.get_model()。 一些讨论是here和here
这是您现在的使用方式。
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()