【问题标题】:NotImplementedError: `create()` must be implemented in serializer.Serializer inheritanceNotImplementedError:`create()` 必须在 serializer.Serializer 继承中实现
【发布时间】:2020-02-13 05:21:41
【问题描述】:

我在使用序列化程序创建身份验证令牌时遇到错误,我是 Django 初学者研究人员并尝试各种方法来解决但无法解决,请任何人都可以帮助我。

文件“/usr/local/lib/python3.7/site-packages/rest_framework/serializers.py”,第 169 行,在创建中 raise NotImplementedError('create() 必须实现。')

NotImplementedError:必须实现create()

class CreateAuthTokenSerializer(serializers.Serializer):
    """Authentication serializer"""

    email = serializers.CharField()
    password = serializers.CharField(
        style={'input_type': 'password'},
        trim_whitespace=False
    )

    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')

        user = authenticate(
            request=self.context.get('request'),
            username=email,
            password=password
        )

        if not user:
            msg = _('unable to authenticate with username and password')
            raise serializers.ValidationError(msg, code='authentication')

        attrs['user'] = user
        return attrs

提前致谢

【问题讨论】:

  • 当您使用serializers.Serializer 时,它不像serializers.ModelSerializer 那样内置了create() 方法。可能你正在尝试调用serializer.save(),如果你想保存一个实例,那么你需要实现create() 方法。但可能你不需要它。更多信息:django-rest-framework.org/api-guide/serializers/…
  • 嗨 Rudra,我不想在 serializers.Serializer 中使用 create() 方法,我想要在这个 [github.com/encode/django-rest-framework/blob/…
  • 然后从视图中删除任何类似于 serializers.save() 的代码,然后它应该被修复

标签: django django-rest-framework python-3.7


【解决方案1】:
class CreateTokenView(ObtainAuthToken):
    """Create a new auth token for the user"""
    serializer_class = AuthTokenSerializer
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

通过使用ObtainAuthToken继承而不是generics.CreateAPIView解决

【讨论】:

    【解决方案2】:

    检查您是否使用了正确的对象,

    比如是ModelSerializer,如果我误用Serializer,就会出现NotImplemented:

    from rest_framework import serializers
    
    from .models import Product
    
    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            fields = '__all__'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多