1

次のような 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 related + Activity data related から特定のフィールドが得られます。たとえば、次のようにすると、次のようになります。

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

また、関連する User オブジェクトの ID などに基づいて、UserActivity からデータを取得したい場合もあります。たとえば、次のようになります。

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 回実行することには興味がありません。

それで、質問は...

無駄なクエリを避けるために、リクエストに応じて関連フィールドユーザーの使用を有効化/無効化できるように、プロセスを最適化する方法はありますか? つまり、リソースの関連オブジェクトをオンザフライで変更するには?

ありがとうございました。

ところで:私はdjango1.4、django-tastypie 0.9.11を使用しています

4

0 に答える 0