2017-02-14 4 views
2

Je suis nouveau sur Django et j'ai du mal à faire fonctionner les routeurs imbriqués. En fait, je suis en train de modéliser le point final /api/v1/organizers/1/events/1, où j'ai Event et Organizer modèles suivants:Le routeur imbriqué ne fonctionne pas

class Event(models.Model): 
    class Meta: 
     db_table = 'events' 

    STATUS_CHOICES = (
     ('scheduled', 'Scheduled'), 
     ('completed', 'Completed'), 
     ('cancelled', 'Cancelled') 
    ) 

    name = models.TextField() 
    purpose = models.TextField() 
    date_time = models.DateTimeField() 
    description = models.TextField() 
    programme = models.TextField() 
    entry_fee = models.DecimalField(max_digits=6, decimal_places=2) 
    status = models.TextField(choices=STATUS_CHOICES) 
    comments = models.TextField(null=True) 
    people_invited = models.ManyToManyField('Contact', through='EventInvitation') 
    organizer = models.ForeignKey('Organizer', on_delete=models.CASCADE) 

class Organizer(models.Model): 
    STATUS_CHOICES = (
     ('inactive', 'Inactive'), 
     ('active', 'Active'), 
    ) 

    class Meta: 
     db_table = 'organizers' 

    first_name = models.TextField() 
    middle_name = models.TextField(null=True) 
    last_name = models.TextField(null=True) 
    email = models.OneToOneField('Email', on_delete=models.CASCADE) 
    company_name = models.TextField(null=True) 
    company_description = models.TextField(null=True) 
    password = models.TextField() 
    login_token = models.TextField(null=True) 
    registered_on = models.DateTimeField(null=True) 
    status = models.TextField(choices = STATUS_CHOICES, default='inactive') 

J'ai créé une autre application appelée rest_api pour gérer l'API. Les modèles sont stockés dans une application appelée shared_stuff. Quoi qu'il en soit, voici le niveau du projet urls.py (ne pas l'esprit l'application front_end pour l'instant):

from django.conf.urls import include, url 

urlpatterns = [  
    url(r'^api/v1/', include('rest_api.urls')), 
    url(r'^', include('frontend.urls')), 
] 

Et voici la urls.py de l'application rest_api:

from django.conf.urls import url, include 
from rest_framework_nested import routers 
from .views import * 

router = routers.SimpleRouter() 

# /organizers/12/events/1 
router.register(r'organizers', OrganizerViewSet, base_name='organizers') 
organizer_router = routers.NestedSimpleRouter(router, r'organizers', lookup='organizers') 
organizer_router.register(r'events', EventViewSet, base_name='organizers-events') 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^', include(organizer_router.urls)), 
] 

Voici le serializers.py pour rest_api application:

class EventSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Event 
     fields = ['id', 'name', 'purpose', 'date_time', 'description', 'programme', 'entry_fee', 'status', 'comments'] 

class OrganizerSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Organizer 
     fields = ['id', 'first_name', 'middle_name', 'last_name', 'email', 'company_name', 'company_description', 'registered_on', 'status'] 

    events = serializers.HyperlinkedIdentityField(
     view_name = 'events_list', 
     lookup_url_kwarg = 'organizer_pk' 
    ) 

Et enfin, voici le views.py de l'application rest_api:

from rest_framework import viewsets 
from .models import * 
from .serializers import * 

class EventViewSet(viewsets.ModelViewSet): 
    def list(self, request, organizer_pk=None, name='events_list'): 
     events = self.queryset.filter(organizer=organizer_pk) 
     serializer = EventSerializer(events, many=True) 
     return Response(serializer.data) 

class OrganizerViewSet(viewsets.ModelViewSet): 
    def list(self, request, name='organizers_list'): 
     data = Organizer.objects.all() 
     serializer = OrganizerSerializer(data, many=True) 
     return Response(serializer.data) 

Je suis sûr qu'il ya beaucoup de choses brisées dans mon code, et c'est là où je besoin d'aide. Le problème est que je reçois l'erreur suivante:

TypeError: list() got an unexpected keyword argument 'organizers_pk'

Je ne sais pas ce qui ne va pas, et appréciera un peu d'aide!

Répondre

1

Je l'ai travaillé en changeant la EventViewSet à ce qui suit:

def list(self, request, organizers_pk=None, name='events_list'): 
    events = self.queryset.filter(organizer=organizers_pk) 
    serializer = EventSerializer(events, many=True) 
    return Response(serializer.data) 

Je ne sais pas pourquoi, mais le nom de l'argument mot-clé est attendu organizers_pk, alors que j'avais organizer_pk. Je voudrais savoir pourquoi c'est ainsi, mais à part ça, mon problème est résolu pour l'instant.