Python django restframework generics.ListCreateAPIView能否处理一对一字段?

Python django restframework generics.ListCreateAPIView能否处理一对一字段?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个模型UserProfile,它有一个与Django用户模型相关的OneToOneField 我在views.py中有UserProfileList class UserProfileList(generics.ListCreateAPIView): queryset = UserProfile.objects.all() serializer_class = UserProfileSerializer 我想将数据发布到UserProfileList 格式

我有一个模型
UserProfile
,它有一个与Django用户模型相关的OneToOneField
我在views.py中有
UserProfileList

class UserProfileList(generics.ListCreateAPIView):
        queryset = UserProfile.objects.all()
        serializer_class = UserProfileSerializer
我想将数据发布到
UserProfileList

格式如下:

{   "username":"username",
    "email":"email@email",
    "password":"password",
    "secret_id":1
}
(“用户名”、“电子邮件”、“密码”来自
User
model 机密id来自
UserProfile

它可以在
User
UserProfile
表中保存数据
可以吗

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    secret_id=models.IntegerField(default=0)
views.py

from rest_framework import generics
from django.contrib.auth.models import User
from .serializers import UserProfileSerializer, UserSerializer
from account.models import UserProfile

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserProfileList(generics.ListCreateAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer

class UserProfileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
序列化程序.py

from django.contrib.auth.models import User
from rest_framework import serializers
from account.models import UserProfile


    class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = UserProfile
            fields = ('user','secret_id')

    class UserSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = User
            fields = ('username','email','password')

是的,这是可能实现的

为了从
UserProfileSerializer
中访问
用户名
电子邮件
密码
字段,您需要在其上定义这些字段,否则,序列化程序的验证将抛出序列化程序上未定义的字段:

class UserProfileSerializer(serializers.HyperLinkedModelSerializer):
    email = serializers.CharField(write_only=True)
    username = serializers.CharField(write_only=True)
    password = serializers.CharField(write_only=True)

    class Meta:
        ...
请注意,显式定义的字段是
仅写
,因此在读取时不会显示这些字段

上述代码将确保这些字段不会从序列化程序的
方法的
验证属性
中删除

在此之后,您有2个选项

选项1 您需要覆盖
UserProfileSerializer
.create()
方法,以便在
UserProfile
模型之外创建
User
模型

class UserProfileSerializer(serializers.HyperLinkedModelSerializer):
    # above definitions

    def create(self, validated_attrs):
        # now you have here the email, username and password arguments 
        email = validated_attrs.pop('email', None)
        username = validated_attrs.pop('username', None)
        password = validated_attrs.pop('password', None)

        # your creation logic here
        user = User.objects.create(...)
        user_profile = UserProfile.objects.create(user=user, ...)
选项2 您可以在
User
创建过程中处理
UserProfile
的创建(请参阅)。为此,您需要定义一个自定义的
UserManager

class UserManager(models.Manager):
...

def create(self, username, email, secret_id=None):
    user = User(username=username, email=email)
    user.save()
    user_profile = UserProfile(
        user=user,
        secret_id=secret_id
    )
    user_profile.save()
    return user

非常感谢。我知道了!!