AssertionError:字段“链接”在序列化程序SprintSerializer上声明,但未包含在“字段”选项

时间:2018-05-22 07:36:15

标签: python django django-rest-framework

我在Julia Elman的书中重现了一些例子 models.py

class Sprint(models.Model):

    name = models.CharField(max_length=100, blank=True, default='')
    description = models.TextField(blank=True, default='')
    end = models.DateField(unique=True)

    def __str__(self):
        return self.name or _('Sprint ending %s') % self.end

serializer.py

from rest_framework import serializers
from django.contrib.auth import get_user_model
from rest_framework.reverse import reverse

from .models import Sprint, Task

User = get_user_model()

class SprintSerializer(serializers.ModelSerializer):

    links = serializers.SerializerMethodField('get_links')

    class Meta:
            model = Sprint
            fields = ('id', 'name', 'description', 'end', 'links',)

    def get_links(self, obj):
        request = self.context['request']
        return {'self': reverse('sprint-detail',kwargs={'pk': obj.pk},request=request),}    

views.py

from django.contrib.auth import get_user_model
from rest_framework import authentication, permissions, viewsets
from .models import Sprint,Task
from .serializers import SprintSerializer,TaskSerializer, UserSerializer

User = get_user_model()

class DefaultsMixin(object):
    authentication_classes = (authentication.BasicAuthentication,authentication.TokenAuthentication,)   
    permission_classes = (permissions.IsAuthenticated,)
    paginate_by = 25
    paginate_by_param = 'page_size'
    max_paginate_by = 100

class SprintViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Sprint.objects.order_by('end')
    serializer_class = SprintSerializer

我试着看看来自shell的repr

from board.serializers import SprintSerializer
>>> s = SprintSerializer()
>>> print (repr(s))

但我有问题

AssertionError: The field 'links' was declared on serializer SprintSerializer, but has not been included in the 'fields' option.

我的DRF

print (rest_framework.VERSION)
3.8.2

如何调试此问题?

1 个答案:

答案 0 :(得分:2)

是的,Alexandr Tartanov建议的工作正常。我们需要通过源

传递参数
links = serializers.SerializerMethodField(source='get_links')

输出

print (repr(s))
SprintSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(allow_blank=True, max_length=100, required=False)
    description = CharField(allow_blank=True, required=False, style={'base_template': 'textarea.html'})
    end = DateField(validators=[<UniqueValidator(queryset=Sprint.objects.all())>])
    links = SerializerMethodField(source='get_links')