1

我在美味派中有一个类似于以下的资源结构:

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 + 用户数据相关 + 活动数据相关的特定字段,这非常好,例如:

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

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

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

这个请求也很好用。

现在,假设请求中发送的{user_id}在join对象中有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 次不感兴趣!

所以,问题是...

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

谢谢你。

顺便说一句:我正在使用 django1.4,django-tastypie 0.9.11

4

0 回答 0