のprefetch_relatedメソッドを使用QuerSet
して、select_related を逆にすることができます。
Asper のドキュメント、
prefetch_related(*ルックアップ)
指定された各ルックアップの関連オブジェクトを単一のバッチで自動的に取得する QuerySet を返します。
これは select_related と同様の目的を持ち、どちらも関連オブジェクトへのアクセスによって引き起こされるデータベース クエリの大洪水を防ぐように設計されていますが、戦略はまったく異なります。
脱水機能を次のように変更すると、データベースは一度だけヒットします。
def dehydrate(self, bundle):
category = Category.objects.prefetch_related("product_set").get(pk=bundle.obj.id)
bundle.data['product_count'] = category.product_set.count()
return bundle
更新 1
脱水関数内でクエリセットを初期化しないでください。queryset は常にMeta
クラスでのみ設定する必要があります。django-tastypie
ドキュメントから次の例を見てください。
class MyResource(ModelResource):
class Meta:
queryset = User.objects.all()
excludes = ['email', 'password', 'is_staff', 'is_superuser']
def dehydrate(self, bundle):
# If they're requesting their own record, add in their email address.
if bundle.request.user.pk == bundle.obj.pk:
# Note that there isn't an ``email`` field on the ``Resource``.
# By this time, it doesn't matter, as the built data will no
# longer be checked against the fields on the ``Resource``.
bundle.data['email'] = bundle.obj.email
return bundle
機能に関する公式django-tastypie
ドキュメントによると、dehydrate()
脱水する
脱水メソッドは、完全に入力された bundle.data を取得し、それに最後の変更を加えます。これは、データの一部が複数のフィールドに依存する可能性がある場合、独自のフィールドを持つ価値のない余分なデータを押し込みたい場合、または返されるデータから何かを動的に削除したい場合に役立ちます。
dehydrate()
bundle.data に最後の変更を加えることのみを目的としています。