2012-02-20 1 views
1

ManyToManyFieldに関連する2つのModelResourceAttackおよびPacketがあります。django-tastypieのネストされたToManyField

これは、1-3アタックを含むPacket.attacksと数百パケットを含むAttack.packetsと表示される傾向があります。

私はこれを行うことを計画してきた方法

はこれです:各 AttackResourceは、クエリセットが AttackResourceにネストされ Attack.packetsを含むクエリセットとへのリンクです Attack.packets属性を持っています。

すなわち:

/api/attack/1/ # contains attribute with URL of /api/attack/1/packets/ 
/api/attack/1/packets/ # contains all packets where attack with id=1 is in Packet.attacks 

どのように私はこれを行うことができますか?

ネストされたリソースを持つためにcyberdelia's gistに従ってみましたが、/api/attack/1/packets/に行くと、実際にはattack.idがpacket.attacksにあるパケットは含まれません。

ModelResourceクラスは要旨と同一であり、その後、私の他のリソースは次のとおりです。

class AttackResource(ModelResource): 
    packets = fields.ToManyField('honeywall.api.PacketResource', 'packets', 'attack') 

    class Meta: 
     queryset = Attack.objects.all() 
     resource_name = 'attack' 

class PacketResource(ModelResource): 
    attacks = fields.ToManyField('honeywall.api.AttackResource', 'attacks', 'packet') 

    class Meta: 
     queryset = Packet.objects.all() 
     resource_name = 'packet' 
     filtering = { 
      'attacks': ALL_WITH_RELATIONS, 
     } 

答えて

0

あなたのリソースにoverride_urls機能をオーバーライドすることによって、ネストされたリソースを作成することができます。 これを行う方法の1つは、tastypie documentationです。これは、すべての子を取得するあなたのリソース内のカスタム関数の作成に基づいており、あなたはすべてのリソースのためにこれを書く必要があります。

これがうまくいかない場合、それを行う別の方法があります。より一般的な方法で、追加の機能を記述することなくすべてのネストされたリソースに対して機能します。これはgistにあります。

+0

私は料理でこれをやろうとしていると、今要旨としてきました。私は迷っている。より多くの情報で質問を更新する。 – rouge8

1

は、あなたのAttackResourceにこれを追加します。

def prepend_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/packets%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_attacks'), name="api_get_attacks"), 
    ] 

def get_attacks(self, request, **kwargs): 
    try: 
     bundle = self.build_bundle(data={'pk': kwargs['pk']}, request=request) 
     obj = self.cached_obj_get(bundle=bundle, **self.remove_api_resource_names(kwargs)) 
    except ObjectDoesNotExist: 
     return HttpGone() 
    except MultipleObjectsReturned: 
     return HttpMultipleChoices("More than one resource is found at this URI.") 

    attack_resource = AttackResource() 
    return attack_resource.get_detail(request, id=obj.pk) 
関連する問題