我在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