2011-12-15 21 views
5

Tôi có 3 kiểu máy. Trò chơi, người chơi và bản nhạc. Một người chơi được gắn vào một trò chơi và một phần được gắn với một người chơi. Các mối quan hệ là các khóa lạ đơn giản.Làm cách nào để đưa mối quan hệ ngược lại không trực tiếp (đi qua một tài nguyên khác) trong django-tastypie?

Khi truy xuất trò chơi, tôi cũng muốn truy xuất tất cả các phần của tất cả người chơi và đưa chúng vào kết quả.

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

Tôi không biết cách thực hiện điều này. Ban đầu tôi đã thay đổi mất nước để nó thực hiện truy vấn đúng, gọi django serialize và đặt nó vào một biến mới trong gói. Điều này có vẻ giống như một nhà nghỉ với tôi. Các serialize của queryset cũng được serialized một lần nữa bởi tastypie gây ra nó để thoát khỏi ký tự báo giá (urgh).

+1

câu trả lời Cant như havn't có đủ uy tín. Giải pháp là chỉ cần thêm trường tomany trên cả trò chơi và trình phát và đặt đầy đủ = true trên cả hai. –

Trả lời

6

Giải pháp là như sau:

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() 
Các vấn đề liên quan