2

我有两个模型,比如说,QuestionTopic

我正在尝试将方法添加到 Question 模型的自定义管理器中,例如某些通过Topic.

我似乎无法为此使用其他经理的代码(也不能import Topic,所以我不能这样做Topic.objects...

class QuestionManager

def my_feed(self, user):
       topics = TopicManager().filter(user=user) # 1st approach
       #topics = Topic.objects.filter(user=user) # 2nd line
       # do something with topics

类主题管理器 ....

使用第一种方法,我收到以下错误:

virtualenv/local/lib/python2.7/site-packages/django/db/models/sql/query.pyc in get_meta(self)
    219         by subclasses.
    220         """
--> 221         return self.model._meta
    222 
    223     def clone(self, klass=None, memo=None, **kwargs):

AttributeError: 'NoneType' object has no attribute '_meta'

我不能使用第二行,因为我不能导入主题,因为主题依赖于这个文件中的主题管理器。有解决方法吗?

4

2 回答 2

5

在任何情况下,您都不能直接使用经理。您总是通过模型类访问它。

如果由于循环依赖而无法在文件顶部导入模型,则只需将其导入方法中即可。

于 2012-04-06T11:47:24.630 回答
0

您应该能够将其放置在managers.py模块的底部:

# Prevent circular import error between models.py and managers.py
from apps.drs import models

在您的管理器类中,您可以使用 引用其他模型models.<modelname>,这应该可以工作,避免循环导入。

例如:

class QuestionManager(Manager):

    def my_feed(self, user):
        topics = models.Topic.objects.filter(user=user)
        # do something with topics

# Prevent circular import error between models.py and managers.py
from apps.drs import models

这是有效的,因为您正在导入模块,而不是模型类,这会导致延迟导入。到函数运行时,模块将被导入,一切都会正常工作。

您还可以使用以下方法按名称加载模型django.apps.get_model()

from django.apps import apps
apps.get_model('my_app', 'MyModel')

详情在这里

例如:

from django.apps import apps

class QuestionManager(Manager):

    def my_feed(self, user):
        topics = apps.get_model('my_app', 'Topic').objects.filter(user=user)
        # do something with topics
于 2021-06-07T20:21:27.663 回答