【问题标题】:TypeError: Field 'facebook_reactions' expected a number but got <class 'rest_framework.fields.IntegerField'>TypeError:字段 'facebook_reactions' 需要一个数字,但得到了 <class 'rest_framework.fields.IntegerField'>
【发布时间】:2022-01-26 10:48:45
【问题描述】:

我在测试 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"]

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: django django-rest-framework django-views


    【解决方案1】:

    你需要调用字段的构造函数,所以:

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

    对于perform_create,你需要使用data.validated_data,所以:

    class EventViewSet(ModelViewSet):
        # …
    
        def perform_create(self, serializer):
            data = serializer.validated_data
            Event.objects.create(
                url=Link.objects.get_or_create(url=data['url'])[0],
                tweet_text=data['tweet_text'],
                facebook_reactions=data['facebook_reactions'],
            )

    【讨论】:

    • 我收到了这个AssertionError: 201 != 400,你认为这是为什么?
    • @NabeelHassan:因为序列化器会验证数据,而你提交的数据是无效的。例如 URL 需要一个协议。您可以打印响应的正文以查看问题所在。
    • 感谢您的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2021-06-03
    • 2021-01-22
    相关资源
    最近更新 更多