TypeError: Field 'facebook_reactions' expected a number but got <class 'rest_framework.fields.IntegerField'>

TypeError: Field 'facebook_reactions' expected a number but got <class 'rest_framework.fields.IntegerField'>

我在测试 EventViewSet 时遇到问题。我收到以下错误

TypeError: Field 'facebook_reactions' expected a number but got <class 'rest_framework.fields.IntegerField'>.

这是我的测试运行:

class EventViewSetTest(BaseTestCase):
    def test_event_created(self):
        event_data = {
            "url": "www.example.com",
            "tweet_text": "Event successful",
            "facebook_reactions": 2,
        }
        response = self.client.post("/api/events/", event_data)
        self.assertEqual(status.HTTP_201_CREATED,response.status_code)

这是我的 views.py:

class EventViewSet(ModelViewSet):
    queryset = Event.objects.all()
    def get_serializer_class(self):
        if self.action == "create":
            return serializers.EventCreateSerializer
        return serializers.EventSerializer

    def perform_create(self, serializer):
        Event.objects.create(
            url=Link.objects.get_or_create(url=serializer.url)[0],
            tweet_text=serializer.tweet_text,
            facebook_reactions=serializer.facebook_reactions,
        )

这是我的 serializers.py:

class EventCreateSerializer(serializers.Serializer):
    url = serializers.URLField
    tweet_text = serializers.CharField
    facebook_reactions = serializers.IntegerField


class EventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = ["url", "tweet_text", "facebook_reactions"]

将不胜感激。

谢谢!

您需要调用字段的构造函数,因此:

class EventCreateSerializer(serializers.Serializer):
    url = serializers.URLField<strong>()</strong>
    tweet_text = serializers.CharField<strong>()</strong>
    facebook_reactions = serializers.IntegerField<strong>()</strong>

至于perform_create,你需要处理数据.validated_data,所以:

class EventViewSet(ModelViewSet):
    # …

    def perform_create(self, serializer):
        <strong>data = serializer.validated_data</strong>
        Event.objects.create(
            url=Link.objects.get_or_create(url=data['url'])[0],
            tweet_text=data['tweet_text'],
            facebook_reactions=data['facebook_reactions'],
        )