Как включить обратную связь, которая не является прямой (проходит через другой ресурс) в django-tastypie? - PullRequest
5 голосов
/ 15 декабря 2011

у меня 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']

Понятия не имею, как это делается. Первоначально я изменил dehydrate, чтобы он просто выполнял правильный запрос, вызывал django serialize и помещал его в новую переменную в комплекте. Это похоже на уловку для меня. Сериализация набора запросов также была снова сериализована вкусным пирогом, заставляя его экранировать кавычки (ург).

1 Ответ

6 голосов
/ 16 декабря 2011

Решение заключается в следующем:

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