无法从另一个模型获取图像字段 "TypeError at /api/users/profile argument of type 'ImageFileDescriptor' is not iterable"

can't get Image field from another model "TypeError at /api/users/profile argument of type 'ImageFileDescriptor' is not iterable"

我正在使用 Django 默认用户模型 创建了用于存储用户额外详细信息的 UserExtended 模型,以便我可以存储额外的用户数据并在需要时调用它们

这是模型

class UserExtended(models.Model):
    extended_id = models.AutoField(primary_key=True, editable=False)
    avatar = models.ImageField(null=True, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

查看函数为:

@api_view(['GET'])
def get_user_profile(request):
    user = request.user
    serializer = UserSerializer(user, many=False)
    return Response(serializer.data)

序列化器:

class UserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField(read_only=True)
    isAdmin = serializers.SerializerMethodField(read_only=True)
    avatar = serializers.ImageField(source=UserExtended.avatar, read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'name', 'avatar', 'isAdmin']

    def get_name(self, obj):
        name = obj.first_name
        if name == '':
            name = obj.email
        return name

    def get_isAdmin(self, obj):
        return obj.is_staff

我想我应该得到这样的 api 回复

GET http://localhost:8000/api/users/profile

HTTP/1.1 200 OK
Date: Mon, 14 Jun 2021 13:45:13 GMT
Server: WSGIServer/0.2 CPython/3.9.2
Content-Type: application/json
Vary: Accept
Allow: OPTIONS, GET
X-Frame-Options: DENY
Content-Length: 103
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

{
  "id": 1,
  "username": "superuser",
  "email": "superuser@test.com",
  "name": "superuser@test.com",
  "avatar": "/images/Capture.PNG"
  "isAdmin": true
}

不工作 但我收到这个错误 请帮帮我

GET http://localhost:8000/api/users/profile

HTTP/1.1 500 Internal Server Error
Date: Mon, 14 Jun 2021 13:48:50 GMT
Server: WSGIServer/0.2 CPython/3.9.2
Content-Type: text/plain; charset=utf-8
X-Frame-Options: DENY
Content-Length: 21746
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

TypeError at /api/users/profile
argument of type 'ImageFileDescriptor' is not iterable

Request Method: GET
Request URL: http://localhost:8000/api/users/profile
Django Version: 3.2.4
Python Executable: D:\work environment\Django_Api\codersavvy\Scripts\python.exe
Python Version: 3.9.2
Python Path: ['D:\work environment\Django_Api\codersavvy', 'C:\Users\S\AppData\Local\Programs\Python\Python39\python39.zip', 'C:\Users\S\AppData\Local\Programs\Python\Python39\DLLs', 'C:\Users\S\AppData\Local\Programs\Python\Python39\lib', 'C:\Users\S\AppData\Local\Programs\Python\Python39', 'D:\work environment\Django_Api\codersavvy', 'D:\work environment\Django_Api\codersavvy\lib\site-packages']
Server time: Mon, 14 Jun 2021 13:48:50 +0000
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'blog.apps.BlogConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Traceback (most recent call last):
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\django\views\generic\base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\decorators.py", line 50, in handler
    return func(*args, **kwargs)
  File "D:\work environment\Django_Api\codersavvy\blog\views.py", line 32, in get_user_profile
    return Response(serializer.data)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 548, in data
    ret = super().data
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 246, in data
    self._data = self.to_representation(self.instance)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 500, in to_representation
    for field in fields:
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 361, in _readable_fields
    for field in self.fields.values():
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 349, in fields
    for key, value in self.get_fields().items():
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 1034, in get_fields
    extra_kwargs, hidden_fields = self.get_uniqueness_extra_kwargs(
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 1389, in get_uniqueness_extra_kwargs
    model_fields = self._get_model_fields(
  File "D:\work environment\Django_Api\codersavvy\lib\site-packages\rest_framework\serializers.py", line 1472, in _get_model_fields
    if '.' in source or source == '*':

请帮帮我

你应该使用 SerializerMethodField .

avatar = serializers.SerializerMethodField()

def get_avatar(self, obj):
    return obj.userextended.avatar.url

class Meta:
    model = User
    fields = ['id', 'username', 'email', 'name', 'avatar', 'isAdmin']