如何在django-tastypie中包含非直接(通过另一个资源)的反向关系?

时间:2011-12-15 19:56:21

标签: django api tastypie

我有3个型号。游戏,玩家和作品。玩家附加到游戏上并且玩家附加到玩家。关系是简单的外键。

在检索游戏时,我还希望从所有玩家中检索所有棋子并将其包含在结果中。

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

我不知道这是怎么做到的。我最初改变了脱水,以便它只是做正确的查询,调用django serialize,并将它放在bundle中的一个新变量中。这对我来说似乎是一个躲闪。查询集的序列化也被tastypie再次序列化,导致它转义引号字符(urgh)。

1 个答案:

答案 0 :(得分:6)

解决方案如下:

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