2011-12-15 18 views
5

Tengo 3 modelos. Juego, jugador y pieza. Un jugador está conectado a un juego y una pieza está unida a un jugador. Las relaciones son simples claves foráneas.¿Cómo incluyo una relación inversa que no es directa (pasa por otro recurso) en django-tastypie?

Al recuperar el juego, también deseo recuperar todas las piezas de todos los jugadores e incluirlas en el resultado.

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'] 

No tengo ni idea de cómo se hace esto. Originalmente cambié el deshidratado para que simplemente haga la consulta correcta, llame a django serialize y lo coloque en una nueva variable en el paquete. Esto parece una burla para mí. La serialización del queryset también fue serializada nuevamente por tastypie, haciendo que escapara de los caracteres de comillas (urgh).

+1

respuesta Cant como havn't tiene suficiente reputación. La solución es simplemente agregar el campo de tomay tanto en el juego como en el jugador y establecer full = true en ambos. –

Respuesta

6

La solución es la siguiente:

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() 
Cuestiones relacionadas