1

ManyToManyField によって関連付けられた2 つModelResourceAttackとがあります。Packet

Packet.attacksこれは、1 ~ 3 個の攻撃がAttack.packets含まれ、数百のパケットが含まれている場合に発生する傾向があります。

私がこれを行うことを計画している方法は次のとおりです。それぞれに、クエリセットを含むクエリセットへのリンクであり、クエリセットがネストされている場所でAttackResourceある属性があります。Attack.packetsAttack.packetsAttackResource

すなわち:

/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

これどうやってするの?

Cyber​​delia の要点に従ってリソースをネストしようとしました/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,
        }
4

2 に答える 2

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)
于 2013-09-19T19:42:04.763 に答える
0

リソースで override_urls 関数をオーバーライドすることにより、ネストされたリソースを作成できます。これを行う 1 つの方法は、tastypie のドキュメントに記載されています。これは、すべての子を取得するリソース内のカスタム関数の作成に基づいており、すべてのリソースに対してこれを記述する必要があります。

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

于 2012-02-20T07:45:04.650 に答える