Python 无法使用OneToOneField Django创建
我被这个问题困扰了一段时间,找不到解决办法。问题是: 背景: 我有CustomUser(AbstractUser)模型和HeroesUser,它与CustomUser模型有OneToOneField关系。(英雄用户是一种用户类型,稍后我会有更多的字段,但现在我只是简单地输入了“城市”) 我希望能够为每个自定义用户创建一个英雄用户,但无法使用此OneToolRelationship。所以如果你有经验,请帮助我 这是我的密码: models.pyPython 无法使用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
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
实例?或者你看到了什么错误?我不完全确定你的问题是什么。