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