Вложенные ToManyFields в django-tastypie - PullRequest
1 голос
/ 20 февраля 2012

У меня есть два ModelResource s, Attack и Packet, связанные с ManyToManyField.

Это имеет тенденцию обнаруживаться с Packet.attacks, содержащим 1-3 атаки, и Attack.packets, содержащим сотни пакетов.

Я планировал сделать это следующим образом: каждый AttackResource имеет атрибут Attack.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 , чтобы иметь вложенные ресурсы, но переход к /api/attack/1/packets/ на самом деле не содержит пакетов, где attack.id находится в package.attacks.

Мой ModelResource класс идентичен GIST, а затем мои другие ресурсы:

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,
        }

Ответы [ 2 ]

1 голос
/ 19 сентября 2013

Добавьте это в свой 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)
0 голосов
/ 20 февраля 2012

Вы можете создать вложенные ресурсы, переопределив функцию override_urls в ваших ресурсах.Один из способов сделать это можно найти в tastypie документации .Он основан на создании пользовательской функции в вашем ресурсе, которая получит все дочерние элементы, и вам нужно написать это для каждого ресурса.

Если это не работает для вас, то есть другой способ сделать это. Более общий способ, и он будет работать для всех вложенных ресурсов без написания каких-либо дополнительных функций.Его можно найти на этой сущности .

...