2012-02-20 81 views
1

我有兩個ModelResource s,AttackPacket,由ManyToManyField相關。django-tastypie中嵌套的ToManyFields

這傾向於顯示與Packet.attacks包含1-3攻擊和Attack.packets包含數百個數據包。

我已經打算做的方式是這樣的:每個AttackResourceAttack.packets屬性,它是一種含Attack.packets的查詢集,並在查詢集嵌套在AttackResource的鏈接。

即:

/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函數創建嵌套資源。 一種方法可以在tastypie documentation中找到。它的基礎是在你的資源中創建一個自定義函數,它將獲得所有的孩子,並且你需要爲每個資源編寫這個函數。

如果這不適合你,那麼還有其他方法可以做到這一點。更通用的方式,它將適用於所有嵌套資源,無需編寫任何附加功能。它可以在這gist找到。

+0

我一直在嘗試與食譜現在用的要點做到這一點。我很茫然。用更多信息更新問題。 – rouge8 2012-02-22 01:26:00

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)