3

特定のモデルインスタンスを「お気に入りに追加」したユーザーを追跡するために、ManyToManytoUserを含むモデルがあります。

このモデルのAPIで、認証されたユーザーから要求されたときに、「is_favorite」ブール値を含めたいと思います。ただし、ストレートモデル属性ではないAPIフィールドは、クラスメソッドとして実装する必要があるようです。これは、Pistonで呼び出されたときにリクエストオブジェクトへの参照を取得しないため、現在のユーザーが誰であるかを知る方法がありません。は。

ピストンドキュメントから:

これらに加えて、必要な他のメソッドを定義できます。これらは、fieldsディレクティブに名前を含めることで使用できます。そうすることで、関数は単一の引数で呼び出されます。モデルのインスタンス。その後、何でも返すことができ、戻り値はそのキーの値として使用されます。

したがって、Piston CRUDメソッドのみがリクエストのインスタンスを取得する場合、クラスメソッドフィールドは、現在認証されているユーザーに関連する出力をどのように生成できますか?

4

2 に答える 2

0

ピストンAPIを認識していませんが、スレッドローカルミドルウェアを使用してリクエストにアクセスするのはどうですか?

これをミドルウェアに追加します

try:                                                                    
    from threading import local                                         
except ImportError:                                                     
    from django.utils._threading_local import local                     

_thread_locals = local()                                                
def get_request():                                                
    return getattr(_thread_locals, 'request', None)                       

class ThreadLocals(object):                                             
    def process_request(self, request):                                 
        _thread_locals.request = request

ThreadLocalsミドルウェアで設定を更新します

import get_requestミドルウェアからのリクエストにアクセスしたい場所ならどこでも

現在のユーザーだけを取得したい場合はrequest.user、スレッドローカルでのみ設定するようにミドルウェアを変更します

于 2010-08-27T01:41:22.533 に答える
0

ピストンウィキページから、属性をネストすることにより、外部キーの内容と多対多のフィールドを指定できると書かれています。あなたの場合

class FriendHandler(BaseHandler):
    allowed_methods = ('GET',)
    model = User
    fields = ('userfield_1', 'userfield_2', ('friends', ('is_friended')))

    def read(self, request):
        # Anything else you might want to do, but return an object of type User
        # Or whatever your model happens to be called

編集:それを行うもう1つの少しハッキーな方法(is_friendedがfalseの場合に友達をまったく通過させたくない場合)は、好きなように構造化されたdictオブジェクトを手動で作成し、それを返すことです。ピストンはdictを処理し、組み込みのエミッターで動作します(JSONは確かに、他のものは試していません)

于 2011-09-20T02:12:33.690 に答える