2011-12-15 10 views
5

Ho 3 modelli. Gioco, giocatore e pezzo. Un giocatore è attaccato ad un gioco e un pezzo è attaccato ad un giocatore. Le relazioni sono semplici chiavi esterne.In che modo includo una relazione inversa che non è diretta (passa attraverso un'altra risorsa) in django-tastypie?

Durante il recupero del gioco, desidero anche recuperare tutti i pezzi da tutti i giocatori e includerli nel risultato.

class GameResource(ModelResource): 
    class Meta: 
     queryset = Game.objects.all() 
     resource_name = 'game' 
     allowed_methods = ['get'] 

class PlayerResource(ModelResource): 
    game = fields.ForeignKey(GameResource, 'game') 
    class Meta: 
     queryset = Player.objects.all() 
     resource_name = 'player' 
     allowed_methods = ['get'] 

class PieceResource(ModelResource): 
    player = fields.ForeignKey(PlayerResource, 'player') 
    class Meta: 
     queryset = Piece.objects.all() 
     resource_name = 'piece' 
     allowed_methods = ['get'] 

Non ho idea di come sia fatto. Inizialmente ho cambiato il disidratato in modo che faccia semplicemente la query giusta, chiama serial django e lo inserisca in una nuova variabile nel pacchetto. Questo mi sembra un vantaggio. Anche il serialize del queryset è stato serializzato di nuovo da tastypie provocando l'escape dei caratteri di citazione (urgh).

+1

risposta Cant come havn't ottenuto abbastanza reputazione. La soluzione è semplicemente aggiungere il campo tomany sia sul gioco che sul giocatore e impostare full = true su entrambi. –

risposta

6

La soluzione è la seguente:

class GameResource(ModelResource): 
    players = fields.ToManyField('blokus.api.PlayerResource', 'player_set', full=True) 
    class Meta: 
     queryset = Game.objects.all() 
     resource_name = 'game' 
     allowed_methods = ['get'] 
     authorization = Authorization() 


class PlayerResource(ModelResource): 
    game = fields.ForeignKey(GameResource, 'game') 
    pieces = fields.ToManyField('blokus.api.PieceResource', 'piece_set', full=True) 

    class Meta: 
     queryset = Player.objects.all() 
     resource_name = 'player' 
     allowed_methods = ['get'] 
     authorization = Authorization() 


class PieceResource(ModelResource): 
    player = fields.ForeignKey(PlayerResource, 'player') 

    class Meta: 
     queryset = Piece.objects.all() 
     resource_name = 'piece' 
     allowed_methods = ['get'] 
     authorization = Authorization() 
Problemi correlati