AssertionError: Поле 'links' было объявлено в сериализаторе SprintSerializer, но не включено в параметр 'fields' - PullRequest
0 голосов
/ 22 мая 2018

У меня проблемы с воспроизведением примера из книги Джулии Элман 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

Я пытаюсь увидеть 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 голосов
/ 22 мая 2018

Да, то, что предложил Александр Тартанов, работает нормально. Нам нужно передать аргументы с источником

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...