我在美味派中有一个类似于以下的资源结构:
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