我有一个带有自定义管理器的模型,用于过滤“活动”对象,即比当前时间低start_date
,比当前时间大end_date
的对象。在
这是我的models.py
的相关部分:
from django.utils.timezone import now
class ActiveObjectManager(models.Manager):
def get_query_set(self):
return super(ActiveObjectManager, self).get_query_set().\
filter(start_date__lt=now(), end_date__gt=now())
class Object(models.Model):
start_date = models.DateTimeField(_('Service start date'), \
auto_now_add=False, null=False, blank=False)
end_date = models.DateTimeField(_('Service end date'), auto_now_add=False, \
null=False, blank=False)
...
objects = models.Manager()
objects_active = ActiveObjectManager()
这个管理器在整个应用程序和djangoshell中工作得很好。但是,如果我在管理接口中创建一个对象,并将start_date
设置为“now”选择器,那么tastype提供的API不会显示这个新创建的对象(尽管它确实显示旧对象)。管理列表正确地将新对象显示为活动的。在
这是我的api.py
的相关部分:
我强烈怀疑的是,当类ActiveObjectResource
被解释一次时,两个{start_date__lt
和{manage.py runserver
之后,now()
返回的值)。在
即使在资源类中按如下方式进行筛选,此问题仍然存在:
class ActiveObjectResource(ModelResource):
...
class Meta:
queryset = Object.objects.\
filter(start_date__lt=now(), end_date__gt=now())
此外,如果我传递如下可调用项,则问题仍然存在:
class ActiveObjectResource(ModelResource):
...
class Meta:
queryset = Object.objects.filter(start_date__lt=now, end_date__gt=now)
有没有办法可以重写ActiveObjectManager
或{
更新:
好的,我似乎需要重写get_object_list
来实现per-request alterations to the queryset,比如:
class ActiveObjectResource(ModelResource):
class Meta:
queryset = Object.objects.all()
def get_object_list(self, request):
return super(MyResource, self).get_object_list(request).\
filter(start_date__lt=now, end_date__gt=now)
但是当我已经在模型级别有一个定制管理器来为我做这项工作时,我不想重复这种逻辑。在
所以我的问题是:如何在我的ModelResource
中使用我的自定义模型管理器?
嗯,关于
ModelResource.Meta
中的queryset。这是excerpt from the tastypie documentation:这里it goes:
所以,是的,似乎实现您所要做的事情的唯一方法就是声明
get_object_list
。新更新:由于
get_object_list
只是一个return self._meta.queryset._clone()
,请尝试如下操作:相关问题 更多 >
编程相关推荐