Каков наилучший способ добавить команду api с django-tastypie? - PullRequest
0 голосов
/ 16 марта 2012

У меня есть следующая модель, и я хочу, чтобы пользователь мог присоединиться к событию с 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 как

# 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 Ответ

1 голос
/ 17 марта 2012

Я думаю, вы могли бы создать "EventResource".Тогда у вас могут быть разные события для присоединения пользователей, ухода пользователей и любых других действий.Поэтому, в принципе, было бы хорошо иметь также «EventTypeResource».

Тогда каждый раз, когда происходит событие, вы просто отправляете «EventResource», указав тип события (указав элемент коллекции EventTypeResource)и любые дополнительные данные, такие как:

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.");
    }
);
...