如何在Django rest框架(DRF)中创建这两个模型在OneToOne关系中的新实例?

2024-10-03 09:12:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个Author模型,其中它与默认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()

问题是否有任何方法可以在一个步骤(请求)中同时创建userauthor?怎么做

序列化程序代码:

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."
    ]
}

Tags: djangofromimportselftruedefaultpermissionsmodels
1条回答
网友
1楼 · 发布于 2024-10-03 09:12:50

为此,您需要为用户创建另一个序列化程序:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"

        extra_kwargs = {
            'password': {'write_only': True},
        }

然后,将AuthorSerializer中的user字段设置为UserSerializer的实例,并以以下方式重写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
}

相关问题 更多 >