2

我是 Django 新手,正在努力让嵌套路由器工作。基本上,我正在尝试对端点进行建模/api/v1/organizers/1/events/1,我拥有EventOrganizer模型如下:

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

我创建了另一个应用程序rest_api来处理 API。模型存储在一个名为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')),
]

这是urls.py来自应用程序的内容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)),
]

这是serializers.py应用rest_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'
    )

最后,这是views.py来自应用程序的内容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)

我确信我的代码中有很多问题,这就是我需要帮助的地方。问题是我收到以下错误:

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

我不确定出了什么问题,希望能得到一些帮助!

4

1 回答 1

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. 我想知道为什么会这样,但除此之外,我的问题现在已经解决了。

于 2017-02-14T09:41:19.447 回答