2017-02-14 105 views
2

我是Django的新手,并且努力让嵌套路由器工作。基本上,我试图端点/api/v1/organizers/1/events/1,在那里我有EventOrganizer型号如下型号:我创建了一个名为rest_api处理API另一个应用程序嵌套路由器不工作

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') 

。模型存储在名为shared_stuff的应用程序中。总之,这里的项目级urls.py(不介意front_end应用程序现在):

from django.conf.urls import include, url 

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

下面是从应用rest_apiurls.py

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)), 
] 

这里的serializers.pyrest_api应用:

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' 
    ) 

最后,这里是从应用的:

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) 

我敢肯定有很多事情在我的代码打破,而这也正是我需要帮助。问题是,我发现了以下错误:

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

我不知道什么是错的,并会得到一些帮助!

回答

1

我得到它的工作通过改变EventViewSet以下几点:

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) 

我不知道为什么,但预期的关键字参数名称为organizers_pk,而我有organizer_pk。我想知道这是为什么,但除此之外,我的问题现在已经解决了。