"用户"对象没有属性"图像"


尝试获取序列化程序UserSerializer上字段image的值时,出现AttributeError。序列化程序字段的名称可能不正确,并且与User实例上的任何属性或键都不匹配。原始异常文本为:"User"对象没有属性"image"。问题是我无法将图像上传到用户配置文件模型。如果没有图像字段,一切都很好。我怎样才能纠正这一点。

这是型号.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)

这是serializer.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

这是视图.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

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.

因为图像是UserProfile的一部分,而不是用户。

将序列化程序的图像字段更新为:

image = serializers.ImageField(source="userprofile.images")

这应该会有所帮助。

最新更新