2012-08-10 11 views
5

Wenn ich versuche, auf ein Feld in einem verwandten Objekt zu filtern, gibt Tastypie einen Fehler zurück. Zum Beispiel läuftWie filtere ich ein Feld in einem verwandten Objekt?

curl -H "Accept: application/json" \ 
    "http://localhost:8080/wordgame/api/v1/rounds/?format=json&players__username=moe" 

returns „Lookups ist nicht mehr als eine Ebene tief auf der‚Spieler‘erlaubt ist.“ Im Grunde versuche ich zu tun, was ich zur Zeit in der Django Shell tun können:

Round.objects.all().filter(players__username=moe.username) 

ich den folgenden Code verwenden, die ich die Kürze halber vereinfachte:

# wordgame/api.py which has tastypie resources 
class RoundResource(ModelResource): 
    players = fields.ManyToManyField(UserResource, 'players',full=True) 
    . . . 

    class Meta: 
     queryset = Round.objects.all() 
     resource_name = 'rounds' 
     filtering = { 
      'players': ALL, 
     } 

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL, 
     } 

# wordgame/models.py which has Django models 
class Round(models.Model): 
    players = models.ManyToManyField(User) 
    word = models.CharField(max_length=75) 
    . . . 

Ich gehe davon aus, dass wegen UserResource definiert einen Filter für das Feld 'Benutzername', der funktioniert, tut dies aber nicht. Ich habe sogar versucht, dem Filter in RoundResource "players__username" hinzuzufügen, aber das hat auch nicht funktioniert.

Ich lese über basic filtering in the docs und schaute auf den Code auf GitHub, aber es scheint nichts dafür zu sein. Ich habe mir auch die advanced filtering documentation angesehen und es scheint nicht zu meinem Anwendungsfall zu passen. Ich habe mir den Tastypie-Code auf GitHub angeschaut, verstehe ihn aber nicht genug, um herauszufinden, ob 1) ich das falsch mache, oder 2) was ich außer Kraft setzen muss, um dies zum Laufen zu bringen.

+0

Ich nehme an, 'ManyToManyField' ist ein Tippfehler; [the Tastypie docs] (http://django-tastypie.readthedocs.org/en/latest/fields.html) habe es als 'fields.ToManyField' – supervacuo

+0

@supervacuo ManyToMany wird in der aktuellen Version als Unterklasse von ToManyField unterstützt. Sie finden es auf GitHub [hier] (https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L768). –

+0

Ah, fair genug. – supervacuo

Antwort

11

Offenbar müssen Sie speziell weiß-Liste, die die Relation-Spanning-Lookups in Ihrer filtering Linie, wie folgt aus:

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL_WITH_RELATIONS, 
     } 

Zumindest ich denken, dass der richtige Ort ist es zu setzen. Die sind auf Beispielen ziemlich dünn. Ein Tastypie Ticket, suggests this should work.

+0

Danke! Das Ändern von "ALL" in "ALL_WITH_RELATIONS" in der RoundResource-Klasse hat funktioniert. Ich kann jetzt die Runden nach Benutzernamen filtern. Ein bisschen mehr Doc oder vielleicht ein besseres Auge (von meiner Seite) hätte das aufgegriffen. –

Verwandte Themen