Python 如何在Django REST中使用序列化程序创建具有嵌套项的对象
我想创建一个管理员。这是我的模型:Python 如何在Django REST中使用序列化程序创建具有嵌套项的对象,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想创建一个管理员。这是我的模型: class Caretaker(models.Model): user = models.OneToOneField(User) language = models.ForeignKey('Translation', blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('language')) patients = models.ManyToManyField
class Caretaker(models.Model):
user = models.OneToOneField(User)
language = models.ForeignKey('Translation', blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('language'))
patients = models.ManyToManyField('Patient', through='CaretakerPatient')
specialists = models.ManyToManyField('Caretaker', through='CaretakerSpecialist')
name = models.CharField(_('name'), max_length=50)
email = models.CharField(_('e-mail'), max_length=100)
time_zone = models.CharField(_('time zone'), max_length=50)
is_primary = models.BooleanField(default=False)
active = models.BooleanField(default=True)
如您所见,OneTONE与django.contrib.auth.models.User之间存在关系
我的API视图如下
@csrf_exempt
@api_view(['POST'])
@renderer_classes((CustomJSONRenderer,))
def create_user(request):
serializer = CaretakerSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
我的序列化程序类
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
class CaretakerSerializer(serializers.ModelSerializer):
user = UserSerializer()
language = serializers.SlugRelatedField(slug_field='language_code', read_only=True)
time_zone = serializers.StringRelatedField()
class Meta:
model = Caretaker
fields = ('id', 'user', 'language', 'name', 'email', 'time_zone', 'active')
def create(self, validated_data):
print validated_data
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
caretaker = Caretaker.objects.create(**validated_data)
return caretaker
我的问题是:发送如下数据:
{'username':'xxx',
“密码”:“xxx”,
“电子邮件”:xxx@xxx.com',
“姓名”:“约翰·史密斯”
...
}
如何拆分用户名和密码以首先创建用户,然后使用此对象创建管理员?已验证的_数据刚刚为我提供了管理员模型的字段。当您使用嵌套的用户序列化程序时,您应该按如下方式发送数据:
{"user": {"username": "xxx", "password": "xxx", ...},
"language": "...",
...
}
然后在验证的\u数据中有一个用户
项,可以创建一个用户实例:
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User(
email=user_data['email'],
username=user_data['username']
)
user.set_password(user_data['password'])
user.save()
caretaker = Caretaker.objects.create(**validated_data)
return caretaker
不要忘记将用户实例传递给管理员模型的create()
方法,以获得数据库中的正确关系:
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User.objects.create(**user_data)
# pass the newly created user instance here
caretaker = Caretaker.objects.create(user=user, **validated_data)
return caretaker
由于JSON中的字段是根据模型命名的,因此可以减少代码行