[英]How to create a django User with Django REST Framework (DRF) 3
[英]How to create new instances of both models contributing in OneToOne relationship in django rest framework (DRF)?
我创建了一个Author
model,其中它与默认 Django 用户具有OneToOne
关系,如下所示:
from django.contrib.auth.models import User
from django.db import models
class Author(models.Model):
user = models.OneToOneField(
User,
related_name='author',
on_delete=models.CASCADE,
default="",
)
is_author = models.BooleanField(
default=True
)
在这里,我创建了以下视图集:
class AuthorViewSet(viewsets.ModelViewSet):
serializer_class = AuthorSerializer
queryset = Author.objects.all()
def get_permissions(self):
if self.action == "list" or self.action == "retrieve" or self.action == "update":
self.permission_classes = [IsCurrentOwner, permissions.IsAdminUser]
elif self.action == "create":
self.permission_classes = [permissions.AllowAny]
return super(AuthorViewSet, self).get_permissions()
问题有什么方法可以一步创建user
和author
(请求)? 如何?
序列化代码:
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = "__all__"
extra_kwargs = {
'password': {'write_only': True},
'id': {'read_only': True}
}
我已经尝试了以下请求,但它不起作用。
#url: localhost:8000/users/
#method: POST
{
"user": {
"username": "mostafa",
"password": "1"
}
}
错误:
{
"user": [
"Incorrect type. Expected pk value, received dict."
]
}
为此,您需要为用户创建另一个序列化程序:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
extra_kwargs = {
'password': {'write_only': True},
}
之后,将UserSerializer
中的 user 字段设置为AuthorSerializer
的实例,并以这种方式覆盖 create 方法:
class AuthorSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Author
fields = "__all__"
extra_kwargs = {
'id': {'read_only': True}
}
def create(self, validated_data):
user = None
if "user" in validated_data:
user_data = validated_data.pop("user") or {}
user = User.objects.create_user(**user_data) # Assuming that it is default django user model
author = Author.objects.create(user=user, **validated_data)
author.save()
return author
请求有效负载的 curl 脚本:
curl --location --request POST 'http://127.0.0.1:8000/users/' \
--header 'Content-Type: application/json' \
--data-raw '{
"user": {
"username": "mostafa",
"password": "abcd"
},
"is_author": true
}'
它的响应如下:
{
"id": 1,
"user": {
"id": 1,
"last_login": null,
"is_superuser": false,
"username": "mostafa",
"first_name": "",
"last_name": "",
"email": "",
"is_staff": false,
"is_active": true,
"date_joined": "2020-12-05T09:54:37.674749Z",
"groups": [],
"user_permissions": []
},
"is_author": true
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.