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
非常感谢。我知道了!!