2012-03-16 1 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."); 
    }, 
); 

하지만이 작업을 수행하는 가장 좋은 방법은 없습니다.

# 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)), 
) 

어떻게해야합니까? EventJoinResource을 작성해야합니까? 모든 제안은 환영합니다 :-)

답변

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''로 무엇을 의미하는지 모르겠다. 제안을 통해 사용자가 특정 이벤트에 어떻게 참여할 수 있습니까? join과 leave를위한 "join"과 같은 타입을 건네 주어야 할까? –

+0

RESTful API에는 조작 또는 메소드 호출 (RPC와 유사한 API의 특성 임)이 없어야합니다. 따라서 이벤트에 참여하기보다는 이벤트를 작성해야합니다 (이벤트를 조작하십시오). EventTypeResource는 가입 또는 탈퇴와 같은 여러 이벤트를 구별하는 데 도움을줍니다. 그래서 네, 가장 간단한 형태의 EventTypeResource는 하나의 속성 "label"또는 "name"을 가질 수 있고 ToOneField()를 통해 EventResource와 관련 될 수 있습니다. 그런 다음 "사용자가 이벤트에 참여 함"은 관련된 EventTypeResource "join"에 대해 생성되는 EventResource로 표현됩니다. – kgr

+0

나는 본다. 고마워요! –

관련 문제