2012-08-10 14 views
5

Se provo a filtrare su un campo in un oggetto correlato, Tastypie restituisce un errore. Ad esempio, l'esecuzioneCome si filtra su un campo in un oggetto correlato?

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

restituisce "Le ricerche non sono ammessi più di un livello profondo sul campo 'giocatori'." In sostanza, sto cercando di fare quello che posso fare attualmente nella shell Django:

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

Sto usando il codice seguente, che ho semplificato per brevità:

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

Sto assumendo che, a causa UserResource definisce un filtro sul campo 'username' che dovrebbe funzionare ma non lo fa. Ho anche tentato di aggiungere "players__username" al filtro in RoundResource, tuttavia non ha funzionato neanche.

Ho letto su basic filtering in the docs e ho guardato il codice su GitHub tuttavia non sembra esserci nulla per questo. Ho anche dato uno sguardo allo advanced filtering documentation e non sembra adattarsi al mio caso d'uso. Ho guardato il codice Tastypie su GitHub ma non lo capisco abbastanza da capire se 1) sto facendo questo sbagliato, o 2) cosa sovrascrivere per farlo funzionare.

+0

Suppongo che 'ManyToManyField' sia un refuso; [i documenti Tastypie] (http://django-tastypie.readthedocs.org/en/latest/fields.html) lo hanno come 'fields.ToManyField' – supervacuo

+0

@supervacuo ManyToMany è supportato nella versione corrente come sottoclasse di ToManyField. Puoi trovarlo su GitHub [qui] (https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L768). –

+0

Ah, abbastanza giusto. – supervacuo

risposta

11

A quanto pare, è necessario specificamente white-list le ricerche relazione-spanning nella vostra linea filtering, in questo modo:

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

Almeno, io penso questo è il posto giusto per metterlo. Il relevant docs sono piuttosto sottili sugli esempi. Un biglietto Tastypie, però, suggests this should work.

+0

Grazie! La modifica di "TUTTI" in "ALL_WITH_RELATIONS" nella classe RoundResource ha funzionato. Ora posso filtrare i round per nome utente. Un po 'più doc, o forse un occhio migliore (da parte mia), avrebbe raccolto su questo. –

Problemi correlati