2012-04-11 5 views
4

In meinem aktuellen Code hat ein Benutzer eine Liste von Zielen, denen er beigetreten ist. Ich möchte, dass ein API-Endpunkt alle verknüpften Ziele des Benutzers aufdeckt. Ich möchte in der Lage sein, diesen API-Endpunkt zu posten, zu platzieren und zu erhalten. Er erhält eine Liste der verbundenen Ziele, fügt der Liste der verbundenen Ziele ein Ziel hinzu oder aktualisiert die Liste der verbundenen Ziele.Wie man viele tanktop als Ressource mit tastypie?

# Joined Goal Resource 
class JoinedGoalResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 
    joined_goals = fields.ManyToManyField(GoalResource, 'joined_goals', full=True) 

    class Meta: 
    authentication = Authentication() 
    authorization = Authorization() 
    queryset = UserProfile.objects.all() 
    resource_name = 'joined_goal' 
    allowed_methods = ['get', 'post', 'put'] 
    filtering = { 
     'user': ALL_WITH_RELATIONS 
    } 

Das Problem mit dem obigen Code ist, dass es Userprofile Modell als queryset nutzt also, wenn ich einen Beitrag dazu bekommen, oder auf dem API-Endpunkt setzt, wird die Userprofile bewirken, anstatt die joined_goals des Benutzers.

Edit: Ich habe meinen Code geändert, so dass die verbundene Ressource überschreibt die obj_create-Methode und fügt nur die beigefügte Zielliste des angemeldeten Benutzers hinzu. Das Problem ist, dass die Methode erfordert, dass ich ein Bündel zurückgebe. Wie erstelle ich das Paket, das zurückgegeben werden soll? Ich tue so etwas wie dieses:

goal_resource = GoalResource 
goal_obj = goal_resource.obj_get(pk=1) 
goal_bundle = goal_resource.build_bundle(obj=goal_obj, request=request) 
return goal_bundle 

Aber die obj_get funktioniert nicht, wenn in einem Argument von pk = 1

Antwort

1

Die Lösung nehmen kann ganz einfach sein.

Sie könnten eine reguläre Ressource implementieren (vergessen Sie die Benutzerrechte) und dann "Creating per-user resources" section of Tastypie cookbook folgen, um die von GET zurückgegebene Liste einzugrenzen und sicherzustellen, dass die neu erstellten Objekte dem aktuellen Benutzer (POST) gehören.

In Bezug auf PUT benötigen Sie nur eine Berechtigungsklasse, die sicherstellt, dass der Benutzer nur berechtigt ist, seine eigenen Ziele zu aktualisieren. Dies ist der schwierigste Teil (aber nicht hart), nur sicherstellen, dass der Wert von user Attribut des goal Bündel das gleiche ein request.user ist, wenn das Verfahren sonst eine Ausnahme auslösen PUT ist und fertig :)

So mit oben würden Sie folgende URIs haben:

GET,POST,PUT /api/users/ #for interaction with Users 
GET,POST,PUT /api/user-goals/ #for interaction with Goals 

und man konnte einführen (für GET):

GET /api/users/goals/ #for displaying user goals in more natural way 

durch folgende Nested Resources section of the cookbook

+0

Es wäre sehr schön, eine Lösung über den "triciest part" zu sehen, denn es gibt immer mehr Fragen wie diese [Q1] (http://stackoverflow.com/questions/8613522/how-to-put-product- to-cart-via-tasytpie-api) [Q2] (http://stackoverflow.com/questions/10111734/tastypie-add-element-to-a-many-to-many-relationship) Q1 war mein Grund für die Registrierung auf stackoverflow :) – seb

+1

Also sollte jemand eine gute Frage stellen. Bei dieser Frage ging es darum, wie man die Objekte ausstellt und wie man mit ihnen interagiert. Ich denke, ich habe darauf geantwortet. Ich gab auch Richtlinien, wie man den Teil, den du erwähnst, implementiert. Es ist nicht schwer, es erfordert nur ein wenig Aufwand, um zu sehen, wie ModelResource funktioniert und was was anruft. Wenn Sie möchten, stellen Sie uns bitte eine Frage, zeigen Sie uns, was Sie versucht haben und wo Sie ein Problem haben und ich werde es gerne tun Hilfe. SO soll aber nicht "Code für mich schreiben" sein. – kgr

+0

Und ich denke, dass ich jeden Punkt in Q1 vor 3 Monaten erfüllt habe. – seb

Verwandte Themen