发生此错误的原因是当您导入
get_top_viewed_posts
在顶部
models.py
这个
Post
模型尚未声明。
你有几个选择。
从顶部移动导入
模型.py
进入方法内部
def send(self):
from social.services import get_top_viewed_posts
posts = get_top_viewed_posts()
不用担心性能,导入是缓存的—但是如果在其他方法中使用它,重复相同的导入可能会很乏味。
抽象类
使函数更通用地将模型作为参数传递,这样就不需要在
services.py
文件:
def get_top_viewed_model(model, popular_ids, order_by='-created_at'):
return model.objects..filter(
pk__in=popular_ids,
).order_by(
order
)
然后:
def send(self):
posts = get_top_viewed_model(type(self), popular_posts_ids)
# at other places
get_top_viewed_model(Posts, popular_posts_ids)
使用自定义管理器
使用
top_viewed
方法:
class TopViewedManager(models.Manager):
def __init__(self, order='-created_at', **kwargs):
self._order = order
self._filter = kwargs
def top_viewed(self):
return self.get_queryset().filter(**self._filter).order_by(self._order)
class Post(models.Model):
...
objects = TopViewedManager(pk__in=popular_posts_ids)
那就在你想用的地方用这个
get_top_viewed_model
:
Post.objects.top_viewed()
这个管理器是非常通用的,所以您可以将它用于任何模型、过滤器和您想要的顺序。
可能还有其他选择,这是个人品味的问题。