Tastype资源不显示新创建的对象(日期筛选问题)

2024-04-27 02:35:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有自定义管理器的模型,用于过滤“活动”对象,即比当前时间低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的相关部分:

^{pr2}$

我强烈怀疑的是,当类ActiveObjectResource被解释一次时,两个{}调用只执行一次,也就是说,API子系统总是用相同的值调用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中使用我的自定义模型管理器?


Tags: 对象ltselffalse管理器getdateobjects
1条回答
网友
1楼 · 发布于 2024-04-27 02:35:36

嗯,关于ModelResource.Meta中的queryset。这是excerpt from the tastypie documentation

If you place any callables in this, they’ll only be evaluated once (when the Meta class is instantiated). This especially affects things that are date/time related. Please see the :ref:cookbook for a way around this.

这里it goes

A common pattern is needing to limit a queryset by something that changes per-request, for instance the date/time. You can accomplish this by lightly modifying get_object_list

所以,是的,似乎实现您所要做的事情的唯一方法就是声明get_object_list

新更新:由于get_object_list只是一个return self._meta.queryset._clone(),请尝试如下操作:

class ActiveObjectResource(ModelResource):
    class Meta:
        queryset = Object.objects_active.all()

    def get_object_list(self, request):
        return Object.objects_active.all()

相关问题 更多 >