【问题标题】:returning a non serializer field otp in django在 django 中返回一个非序列化器字段 otp
【发布时间】:2017-08-09 01:33:39
【问题描述】:

我正在尝试将 otp 与其他序列化程序数据一起返回到我的响应中。但由于它不是通过请求提交的,我无法理解如何给予它作为回应。 OTP 完美地与用户表中的其他数据一起存储,但我仅在返回它作为响应时遇到问题。我的代码如下:

models.py

class User(AbstractUser):
    phone_number = models.IntegerField(null=True)
    otp = models.IntegerField(null=True)

序列化器.py

class UserSerializer(serializers.ModelSerializer):
  password = serializers.CharField(write_only=True)
  password_confirmation = serializers.CharField(read_only=True)


  class Meta:
    model = User
    fields = ('username', 'password', 'password_confirmation', 'email', 'first_name', 'last_name', 'phone_number')

  def create(self, validated_data):
    password = validated_data.pop('password', None)
    instance = self.Meta.model(**validated_data)
    if password is not None:
        instance.set_password(password)
        instance.save()
    instance.otp = randint(1, 98787)
    instance.save()
    return instance

  def otp(self):
    instance = self.Meta.model()
    return instance.otp

views.py

@api_view(['POST'])
def user_signup(request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
    serializer.save()
    content = {'user': serializer.data, 'otp': UserSerializer.otp()}
    return Response(content, status=status.HTTP_201_CREATED)

【问题讨论】:

    标签: python django api django-rest-framework response


    【解决方案1】:

    由于serializer.save() 返回实例,您可以执行以下操作:

    if serializer.is_valid():
        instance = serializer.save()
        content = {'user': serializer.data, 'otp': instance .otp}
    

    所以UserSerializer 中的def otp(self) 不是必需的。

    【讨论】:

    • @RishabhPandey 欢迎您!如果对您有帮助,您可以接受我的回答。
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 2021-01-17
    • 1970-01-01
    • 2015-10-08
    • 2021-01-20
    • 1970-01-01
    • 2018-10-13
    • 2018-10-29
    相关资源
    最近更新 更多