2012-03-16 6 views
0

私は以下のモデルを持っており、ユーザーはAPI でdjango-tastypieとイベントに参加できます。django-tastypieでコマンドapiを追加する最も良い方法は何ですか?

# Conceptual, may not work. 
class Event(models.Model): 
    title = models.CharField('title', max_length=255) 
    users = models.ForeignKey(User) 

    def join(self, user): 
     self.users.add(user) 
    def leave(self, user): 
     self.users.remove(user) 

# join the events with API like... 
jQuery.post(
    '/api/v1/events/1/join', 
    function(data) { 
     // data should be a joined user instance 
     // or whatever 
     alert(data.username + " has joined."); 
    }, 
); 

しかし、私はこれを行う最良の方法を知らない。 EventJoinResource likeを作成する必要があります

# Conceptual, may not work. 
class EventJoinResource(Resource): 
    action = fields.CharField(attribute='action') 

    def post_detail(self, request, **kwargs): 
     pk = kwargs.get('pk') 
     action = kwargs.get('action') 
     instance = Event.objects.get(pk=pk) 
     getattr(instance, action)(request.user) 

resource = EventJoinResource() 

# ??? I don't know how to write this with django-tastypie urls 
urlpatterns = patterns('', 
    ('r'^api/v1/events/(?P<pk>\d+)/(?P<action>join|leave)/$', include(resource.urls)), 
) 

どうすればよいですか?どんな提案も歓迎します:-)

答えて

1

"EventResource"を作成できると思います。その後、参加しているユーザー、離脱しているユーザー、その他の操作に対して、異なるイベントを設定することができます。だから、基本的には "EventTypeResource"も持っているのが良いでしょう。

次にイベントが発生するたびに、あなたは、単にこのように「EventResource」(EventTypeResourceコレクションの要素を指定することによって)イベントの種類を指定し、余分なデータをPOSTします:

jQuery.ajax ({ 
    url : '/api/v1/events/', #note the collection URI not the element URI 
    data : { 
     type : '/api/v1/event-types/<pk_of_the_event_type', #URI of EventTypeResource 
     extra_data : { ... } 
    }, 
    success : function(data) { 
     // data should be a joined user instance 
     // or whatever 
     alert(data.username + " has joined."); 
    } 
); 
+0

Sorro I '' EventTypeResource''の意味を理解しないでください。あなたの提案では、ユーザーはどのようにして特定のイベントに参加できますか?私は参加のための "参加"のような型を渡すべきですか? –

+0

RESTful APIでは、操作やメソッド呼び出し(RPCのようなAPIの特徴です)はないはずです。したがって、イベントに参加するのではなく、イベントを作成するだけです(イベントを操作してください)。 EventTypeResourceは、参加や離脱などのさまざまなイベントを区別するのに役立ちます。したがって、最も単純な形式のEventTypeResourceでは、「ラベル」または「名前」という属性を1つしか持たず、ToOneField()を介してEventResourceに関連付けることができます。次に、「イベントに参加するユーザー」は、関連するEventTypeResourceの「参加」のイベント・ソースとして作成されます。 – kgr

+0

私は参照してください。どうもありがとう! –

関連する問題