0

我正在尝试创建一个简单的 API 来获取用户注册。

我使用默认用户表进行身份验证,创建了另一个名为“电话”的表,与用户一对一关系。

在此处输入图像描述

我正在尝试在密码上方添加“电话”字段。(我希望附加的图像是可见的)。

**

序列化程序.py

class UserRegisterSerializer(serializers.ModelSerializer): class Meta: model = UserDetailsModel fields = ('phone', 'user')

类 RegisterSerializer(serializers.ModelSerializer): 密码 = serializers.CharField(max_length=68, min_length=6, write_only=True)

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

**

models.py<< ** 类 UserDetailsModel(models.Model):

phone = models.IntegerField()
balance = models.DecimalField(max_digits=10, decimal_places=2, default=0)
user = models.OneToOneField(get_user_model(),primary_key='email' , on_delete=models.CASCADE)

def __str__(self):
    return str(self.user)

**

视图.py

** 类 RegisterView(generics.GenericAPIView): serializer_class = RegisterSerializer

def post(self, request):
    user = request.data
    serializer = self.serializer_class(data=user)
    serializer.is_valid(raise_exception=True)
    serializer.save()

    user_data = serializer.data

    return Response(user_data,status=status.HTTP_201_CREATED)

类 DetailsRegisterView(generics.GenericAPIView): serializer_class = UserRegisterSerializer

def post(self, request):
    user = request.data
    serializer = self.serializer_class(data=user)
    serializer.is_valid(raise_exception=True)
    serializer.save()

    user_data = serializer.data

    return Response(user_data,status=status.HTTP_201_CREATED)

**

网址

** urlpatterns = [

path('',RegisterView.as_view()),
path('details', DetailsRegisterView.as_view())

] **

4

2 回答 2

0

更新代码:

序列化器>

从 django.contrib.auth.models 导入用户 从 django.http 导入 JsonResponse

从 rest_framework 导入序列化程序

从 .models 导入 UserDetailsModel

类 RegisterSerializer(serializers.ModelSerializer):

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

类 UserRegisterSerializer(serializers.ModelSerializer): user = RegisterSerializer(required=True)

class Meta:
    model = UserDetailsModel
    fields = ('phone','user')

def create(self, validated_data):

    user_data = validated_data.pop('user')

    user = RegisterSerializer.create(RegisterSerializer(), validated_data=user_data)

    data, created = UserDetailsModel.objects.update_or_create(user=user,
                        phone=validated_data.pop('phone'))

    return data

class DetailView(serializers.ModelSerializer): user = RegisterSerializer(read_only=True) class Meta: model = UserDetailsModel fields = ('user','phone')

其余代码保持不变。

于 2020-09-14T19:45:15.803 回答
0

您可能可以在带有 FK 的序列化程序中使用源代码

class RegisterSerializer(...)
    ...
    phone = serializers.CharField(..., source='userdetails.phone')

另见:文档

我对创建案例有些怀疑,在更新案例中,此代码可以正常工作。

另请参阅:如何在 Django 中使用 Rest Framework 序列化关系 OneToOne?

以及解决问题的另一种方法:嵌套序列化程序

于 2020-09-14T15:30:59.797 回答