/ / canonical_resource_for( 'object')からのTastypieビルドデータバンドル-python、django、tastypie

canonical_resource_for( 'object')からのTastypie構築データバンドル-python、django、tastypie

tastypieの正規リソースに基づいてJSONを含むコンテキストパラメータ「data」を返すDjangoTemplateViewを作成しようとしています。

リソース

class FooResource(ModelResource):
bars = fields.ToManyField("app.api.v1.resources.BarResource", "bars", null=True, full=True)

class Meta:
queryset = Foo.objects.all()
resource_name = "foo"
# ...

モデル

class FooDetailView(TemplateView):
template_name = "app/foo_detail.html"

def get_detail(self, slug):
foo_resource = v1_api.canonical_resource_for("foo")

try:
foo = foo_resource.cached_obj_get(slug=slug)
except Foo.DoesNotExist:
raise Http404

bundle = foo_resource.full_dehydrate(foo_resource.build_bundle(obj=foo))
return bundle.data

def get_context_data(self, **kwargs):
base = super(FooDetailView, self).get_context_data(**kwargs)
base["data"] = self.get_detail(base["params"]["slug"])
return base

これは機能しますが、FooとBarの逆の関係は、手動プロセスではシリアル化されないようです。TemplateViewはこれらを文字列として返します。応答は次のとおりです。

{
"title": u"I am Foo.title",
"bars": [<Bundle for obj: "1" and with data: "{"title": u"I am Bar.title"}"]
}

それで、質問、バンドルを構築するときに逆の関係をどのように繰り返すのですか?

回答:

回答№1は0

答えは、脱水後にresource.serializerを介してバンドルを実行することでした

def get_detail(self, slug):
qr = v1_api.canonical_resource_for("question")
try:
question = qr.cached_obj_get(slug=slug)
except Question.DoesNotExist:
raise Http404

bundle = qr.full_dehydrate(qr.build_bundle(obj=question))

# create response
desired_format = qr.determine_format(self.request)
serialized = qr.serialize(self.request, bundle, desired_format)
return serialized