“用户”对象没有属性“图像”

时间:2018-07-25 06:15:55

标签: django python-3.x django-rest-framework

尝试在序列化程序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.

2 个答案:

答案 0 :(得分:1)

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

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

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

这应该有帮助。

答案 1 :(得分:0)

此错误是因为您的UserSerializerimage实例中搜索了User属性,但找不到。因此,您必须使用source

image字段引用到UserProfile的{​​{1}}字段中

更改image

image = serializers.ImageField()

因此您的序列化器将为

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