django-tastypie:根据请求加载字段

时间:2013-05-19 17:07:09

标签: django tastypie

我在tastypie中有一个类似于以下内容的资源结构:

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()

class ActivityResource(ModelResource):
    class Meta:
        queryset = Activity.objects.all()

class UserActivityResource(ModelResource):
    user = fields.ToOneField(UserResource, 'user')
    activity = fields.ToOneField(ActivityResource, 'activity', full=True)

    class Meta:
        queryset = UserActivity.objects.all()
        filtering = {
            'user': ALL_WITH_RELATIONS,
            'activity': ALL_WITH_RELATIONS
        }

显然是多对象关系。

有时我想使用此对象的特定ID从UserActivity检索数据,这样我就可以在结果中获得UserActivity + User data相关的特定字段+与Activity相关的数据,这非常好,例如:

GET /api/v1/user_activity/{user_activity_id}/

其他时候我想根据UserActivity检索数据,例如相关User对象的id,例如:

GET /api/v1/user_activity/?user={user_id}

此请求也很有效。

现在,假设请求中发送的{user_id}在连接对象中有10个相关活动(ActivityResource)。所以,当我查看请求执行时,我会注意到系统正在运行以下查询来构建结果:

select count(*) from user_activity where {filters} (building meta...ok)

对于每项相关活动(10次):

select user_activity.* from user_activity where {filters} (getting user_activity data...ok)
select activity.* from activity where {filters} (getting activity data...ok)
select user.* from user where id={user_id} (getting user data...ok?)

问题是,我已经知道用户用来查找相关活动,然后,我不需要再次查询其数据,当然我对执行相同查询不感兴趣 10次< /强>!

所以,问题是......

有没有办法优化流程,所以我可以根据请求激活/停用相关字段 user 的使用,以避免无用的查询?或换句话说,即时修改资源的相关对象?

谢谢。

BTW:我正在使用django1.4,django-tastypie 0.9.11

0 个答案:

没有答案