尝试在序列化程序image
上获取字段UserSerializer
的值时出现AttributeError。
序列化程序字段的名称可能不正确,并且与User
实例上的任何属性或键都不匹配。
原始异常文本为:“用户”对象没有属性“图像”。
问题是我无法将图像上传到用户配置文件模型。没有图像字段,一切正常,我该怎么做?
这是模型。py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class UserProfile(models.Model):
objects = models.Manager()
user = models.OneToOneField(User, on_delete=models.CASCADE)
description = models.CharField(max_length=100, default='')
city = models.CharField(max_length=100, default='')
website = models.URLField(default='')
phone = models.IntegerField(default=0)
images = models.ImageField(upload_to='profile_image', blank=True)
def __str__(self):
return self.user.username
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
这是序列化程序。py
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from django.contrib.auth.models import User
from accounts.models import UserProfile
class UserSerializer(serializers.ModelSerializer):
description = serializers.CharField( required=False)
city = serializers.CharField(required=False)
mobile = serializers.IntegerField(required=False)
website = serializers.URLField(required=False)
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(min_length=8)
first_name = serializers.CharField(validators=None,max_length=100, required=True)
last_name = serializers.CharField(validators=None, max_length=100, required=True)
image = serializers.ImageField()
class Meta:
model = User
fields = [
'username',
'email',
'first_name',
'last_name',
'description',
'city',
'website',
'mobile',
'image',
'password',
]
def create(self, validated_data):
profile_description = validated_data.pop('description')
profile_city = validated_data.pop('city')
profile_website = validated_data.pop('website')
profile_phone = validated_data.pop('mobile')
profile_image = validated_data.pop('image')
user = User.objects.create(**validated_data)
user.set_password(validated_data['password'])
user.save()
user.userprofile.description = profile_description
user.userprofile.city = profile_city
user.userprofile.website = profile_website
user.userprofile.phone = profile_phone
user.userprofile.images = profile_image
user.userprofile.save()
return user
这是views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status,generics
from rest_framework.authtoken.models import Token
from accounts.api.serializers import UserSerializer
from django.contrib.auth import login,authenticate
from rest_framework.parsers import JSONParser,MultiPartParser,FormParser
from django.contrib.auth.models import User
class UserCreate(APIView):
"""
Creates the user.
"""
serializer_class = UserSerializer
parser_classes = (MultiPartParser, FormParser)
def post(self, request, format='json'):
serializer = UserSerializer(data=request.data,)
if serializer.is_valid():
raw_password = serializer.validated_data.get('password')
user = serializer.save()
if user:
token = Token.objects.create(user=user)
json = serializer.data
json['token'] = token.key
user = authenticate(username=user.username, password=raw_password)
login(request, user)
return Response(json, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
这是回溯
Traceback:
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
35. response = get_response(request)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/views/generic/base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
483. response = self.handle_exception(exc)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
443. self.raise_uncaught_exception(exc)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
480. response = handler(request, *args, **kwargs)
File "/home/vishnu/Django/tutorial/accounts/api/views.py" in post
22. user = serializer.save()
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in save
214. self.instance = self.create(validated_data)
File "/home/vishnu/Django/tutorial/accounts/api/serializers.py" in create
45. user = User.objects.create(**validated_data)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/db/models/query.py" in create
415. obj = self.model(**kwargs)
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/db/models/base.py" in __init__
490. _setattr(self, prop, kwargs[prop])
File "/home/vishnu/Django/tutorial/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __set__
430. self.related.related_model._meta.object_name,
Exception Type: ValueError at /users/api/users
Exception Value: Cannot assign "{'images': <InMemoryUploadedFile: image001.jpg (image/jpeg)>}": "User.userprofile" must be a "UserProfile" instance.
答案 0 :(得分:1)
因为图像是UserProfile的一部分,而不是用户。
将序列化程序的图像字段更新为此:
image = serializers.ImageField(source="userprofile.images")
这应该有帮助。
答案 1 :(得分:0)
此错误是因为您的UserSerializer
在image
实例中搜索了User
属性,但找不到。因此,您必须使用source
image
字段引用到UserProfile
的{{1}}字段中
更改image
image = serializers.ImageField()
因此您的序列化器将为
image = serializers.ImageField(source='userprofile.images')