1

元のobj_getメソッドをオーバーライドする新しいModelResourceを実装する必要があります。どのようなオブジェクトを返却する必要がありますか?Djangoモデルのインスタンス?Tastypieのドキュメントでは十分に説明されていません。私がDjangoモデルを持っていて、jsonに変換して、GETリクエストを行った人に送り返したいとしましょう。通常はどのように実装されますか?

私はこのコードを持っています:

  def obj_get(self, request=None, **kwargs):
    return Item.objects.get(id=kwargs['pk'])

私がやろうとしていることをお見せするだけです。戻らなければならないのはDjangoインスタンスではないことがわかりました。何を返却する必要がありますか?

4

1 に答える 1

3

実際、それはまさにあなたが返すべきものです。Tastypie の次の実装を参照することをお勧めしますobj_get

 def obj_get(self, request=None, **kwargs):
    """
    A ORM-specific implementation of ``obj_get``.

    Takes optional ``kwargs``, which are used to narrow the query to find
    the instance.
    """
    try:
        base_object_list = self.get_object_list(request).filter(**kwargs)
        object_list = self.apply_authorization_limits(request, base_object_list)
        stringified_kwargs = ', '.join(["%s=%s" % (k, v) for k, v in kwargs.items()])

        if len(object_list) <= 0:
            raise self._meta.object_class.DoesNotExist("Couldn't find an instance of '%s' which matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs))
        elif len(object_list) > 1:
            raise MultipleObjectsReturned("More than '%s' matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs))

        return object_list[0]
    except ValueError:
        raise NotFound("Invalid resource lookup data provided (mismatched type).")

ご覧のように、条件 (この場合は を含む必要があります) をself.get_object_list満たすアイテムのリストを取得するためにを使用し、 1 つのアイテムのみを取得することを望んでいます。そのような場合、それらは最初の (そしてそのリストの唯一の項目) を返します。それ以外の場合は、例外が発生します。ただし、Django の場合のリストは単なるクエリセットです。kwargspk

一般obj_getに、リソース属性に対応するプロパティを持つオブジェクトを返す必要があります。この良い例は、「Riak を MessageResource に使用する」に示されています。この例では、辞書がRiakObjectクラスにラップされているため、代わりにTastypie で必要とされるobj[ 'attribute' ]ことを行うことができます(したがって、Django モデル インスタンスが機能します)。obj.attribute

要約すると、Django モデル インスタンスを返すことができます。または、余分な作業が必要でパフォーマンスを低下させたい場合は、モデル インスタンス属性から辞書を作成し、RiakObject上記のようにクラスにラップすることができます。Djangoの場合、後者はお勧めしません:)

幸運を!

于 2012-04-17T10:48:43.787 に答える