Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用OneToOneField Django创建_Python_Django_Api_Serialization_One To One - Fatal编程技术网

Python 无法使用OneToOneField Django创建

Python 无法使用OneToOneField Django创建,python,django,api,serialization,one-to-one,Python,Django,Api,Serialization,One To One,我被这个问题困扰了一段时间,找不到解决办法。问题是: 背景: 我有CustomUser(AbstractUser)模型和HeroesUser,它与CustomUser模型有OneToOneField关系。(英雄用户是一种用户类型,稍后我会有更多的字段,但现在我只是简单地输入了“城市”) 我希望能够为每个自定义用户创建一个英雄用户,但无法使用此OneToolRelationship。所以如果你有经验,请帮助我 这是我的密码: models.py from django.contrib.auth.m

我被这个问题困扰了一段时间,找不到解决办法。问题是:

背景:

我有CustomUser(AbstractUser)模型和HeroesUser,它与CustomUser模型有OneToOneField关系。(英雄用户是一种用户类型,稍后我会有更多的字段,但现在我只是简单地输入了“城市”)

我希望能够为每个自定义用户创建一个英雄用户,但无法使用此OneToolRelationship。所以如果你有经验,请帮助我

这是我的密码:

models.py

from django.contrib.auth.models import AbstractUser
import datetime

class CustomUser(AbstractUser):
    is_hero = models.BooleanField(default=False)
    is_host = models.BooleanField(default=False)
    want_newsletter = models.BooleanField(default=False)

    def __str__(self):
        return self.username

class HeroesUser(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, primary_key=True)
    city = models.CharField(max_length=50, default="")
序列化程序.py

from .models import CustomUser, HeroesUser
from django.utils import timezone

class CustomUserSerializer(serializers.Serializer):
    id = serializers.ReadOnlyField()
    username = serializers.CharField(max_length=200)
    email = serializers.CharField(max_length=200)
    password = serializers.CharField(write_only=True)
    first_name = serializers.CharField(max_length=200)
    last_name = serializers.CharField(max_length=200)
    is_hero = serializers.BooleanField(default=False)
    is_host = serializers.BooleanField(default=False)
    is_staff = serializers.BooleanField(default=False)

    def create(self, validated_data):
        return CustomUser.objects.create_user(**validated_data)

class CustomUserDetailSerializer(CustomUserSerializer):
    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
        instance.is_hero = validated_data.get('is_hero', instance.is_hero)
        instance.is_host = validated_data.get('is_host', instance.is_host)
        instance.is_staff = validated_data.get('is_staff', instance.is_staff)
        instance.save()
        return instance

class CustomUserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = '__all__'



class HeroesUserSerializer(serializers.Serializer):
    user = serializers.ReadOnlyField(source='user.id')
    city = serializers.CharField(max_length=50)
    def create(self, validated_data):
        return HeroesUser.objects.create(**validated_data)
views.py

from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions
from .models import CustomUser, HeroesUser
from .serializers import CustomUserSerializer, CustomUserDetailSerializer, CustomUserProfileSerializer, HeroesUserSerializer
from .permissions import IsOwnerOrReadOnly

class CustomUserList(APIView):
# should not have permision here because we would not be able to create a new user without having a token
    def get(self, request):
        users = CustomUser.objects.all()
        serializer = CustomUserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = CustomUserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)


class CustomUserDetail(APIView):
    permissions_classes = [
        permissions.IsAuthenticatedOrReadOnly,
        IsOwnerOrReadOnly
    ]

    def get_object(self, username):
        try: 
            user = CustomUser.objects.get(username=username)
            self.check_object_permissions(self.request, user)
            return user
        except CustomUser.DoesNotExist:
            raise Http404

    def get(self, request, username):
        user = self.get_object(username)
        serializer = CustomUserSerializer(user)
        return Response(serializer.data)

    def put(self, request, username):
        user = self.get_object(username)
        data = request.data
        serializer = CustomUserDetailSerializer(
            instance=user,
            data=data,
            partial=True
        )
        if serializer.is_valid():
            serializer.save()
            return Response(
                serializer.data
            )
        return Response(
            serializer.errors
            )

    def delete(self, request, username):
        user = self.get_object(username)
        user.delete()
        return Response(   
            status=status.HTTP_204_NO_CONTENT
        )

class HeroList(APIView):
    def post(self, request):
        serializer = HeroesUserSerializer(data=request.data)
        if serializer.is_valid():
            return Response(serializer.data)
        return Response(serializer.errors)
url.py

from rest_framework.urlpatterns import format_suffix_patterns
from . import views

urlpatterns = [
    path('users/', views.CustomUserList.as_view()),
    path('users/heroes/', views.HeroList.as_view()),
    path('users/<str:username>/', views.CustomUserDetail.as_view()),
    
]

urlpatterns = format_suffix_patterns(urlpatterns)```
从rest\u framework.urlpatterns导入格式\u后缀\u模式
从…起导入视图
URL模式=[
路径('users/',views.CustomUserList.as_view()),
路径('users/heros/',views.HeroList.as_view()),
路径('users/',views.CustomUserDetail.as_view()),
]
urlpatterns=格式\后缀\模式(urlpatterns)```

您当前如何创建
HeroesUser
实例?或者你看到了什么错误?我不完全确定你的问题是什么。