Django REST序列化程序使用错误的模型进行序列化

时间:2018-07-14 13:11:59

标签: django django-rest-framework

问题:

我的序列化程序使用错误的Model进行序列化。我希望序列化程序使用我的ProfileInfo模型,但没有使用。它使用User模型。他们有一个OneToOneRelationship。我不知道为什么,因为我在元数据中定义了序列化程序应使用ProfileInfo模型。

因此,当我尝试使用-> username=serializers.Field(source='user.username')序列化用户名时,Django显示此错误:  “用户”对象没有属性“用户”

能否请您向我解释为什么使用了错误的模型?谢谢您的帮助。

序列化器:

class ProfileInfoSerializer(serializers.ModelSerializer):
    image = serializers.SerializerMethodField()
    socialMediaLinks = serializers.SerializerMethodField("get_social_media_links")
    username = serializers.Field(source='user.username')

    class Meta:
        model = ProfileInfo
        fields = ['username', 'description', 'image', 'socialMediaLinks']

    def get_image(self, obj):
        request = self.context.get('request')
        photo_url = obj.image.url
        return request.build_absolute_uri(photo_url)


class UserInfoSerializer(serializers.ModelSerializer):
    user = ProfileInfoSerializer()
    wingman = ProfileInfoSerializer()
    clan = ClanSerializer()

    class Meta:
        model = ProfileInfo
        fields = ['user', 'clan', 'wingman']

型号:

class ProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    wingman = models.OneToOneField(User, on_delete=None, related_name="wingman", null=True)
    clan = models.ForeignKey(Clan, on_delete=None)
    image = models.ImageField(upload_to="", default="", null=True)
    description = models.CharField(max_length=5000, null=True)

Api:

class ProfileInfoApi(APIView):
    def get(self, request, id):
        profileInfo = ProfileInfo.objects.get(pk=id)
        serializer = UserInfoSerializer(profileInfo, context={'request': request})
        return Response(serializer.data)

跟踪:

Internal Server Error: /api/profileInfo/1/
Traceback (most recent call last):
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\views\generic\base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\_sources\Gamingplattform\Backend\gamingplattform\profileInfo\api.py", line 18, in get
    return Response(serializer.data)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 560, in data
    ret = super(Serializer, self).data
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 527, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\fields.py", line 570, in to_representation
    field_name=self.field_name,
NotImplementedError: Field.to_representation() must be implemented for field username. If you do not need to support write operations you probably want to subclass `ReadOnlyField` instead.
Internal Server Error: /api/profileInfo/getFriends/1/
Traceback (most recent call last):
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\fields.py", line 441, in get_attribute
    return get_attribute(instance, self.source_attrs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\fields.py", line 100, in get_attribute
    instance = getattr(instance, attr)
AttributeError: 'User' object has no attribute 'user'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\django\views\generic\base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\_sources\Gamingplattform\Backend\gamingplattform\profileInfo\api.py", line 36, in get
    return Response(serializer.data)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 765, in data
    ret = super(ListSerializer, self).data
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 683, in to_representation
    self.child.to_representation(item) for item in iterable
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 683, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 527, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py", line 514, in to_representation
    attribute = field.get_attribute(instance)
  File "C:\Users\Aaron Visang\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\fields.py", line 462, in get_attribute
    raise type(exc)(msg)
AttributeError: Got AttributeError when attempting to get a value for field `username` on serializer `ProfileInfoSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'user'.

1 个答案:

答案 0 :(得分:2)

您正在尝试使用ProfileInfo序列化程序来序列化UserInfoSerializer实例,这是不可能的。所以 更改

serializer = UserInfoSerializer(profileInfo, context={'request': request})

 serializer = ProfileInfoSerializer(profileInfo, context={'request': request})



因此,您的看法就像,

class ProfileInfoApi(APIView):
    def get(self, request, id):
        profileInfo = ProfileInfo.objects.get(pk=id)
        serializer = ProfileInfoSerializer(profileInfo, context={'request': request})
        return Response(serializer.data)

UPDATE-1
它是NotImplementedError,除非需要继承,否则不应该使用serializer.Field类。所以改变

username = serializers.Field(source='user.username')

username = serializers.CharField(source='user.username')<br>

除此更新外,我想通知您,您将一行定义为socialMediaLinks = serializers.SerializerMethodField("get_social_media_links"),但是没有名为get_social_media_links的方法。确定会出现一些错误



,因此 ProfileInfoSerializer 应如下所示

class ProfileInfoSerializer(serializers.ModelSerializer):
    image = serializers.SerializerMethodField()
    socialMediaLinks = serializers.SerializerMethodField("get_social_media_links")
    username = serializers.CharField(source='user.username')

    class Meta:
        model = ProfileInfo
        fields = ['username', 'description', 'image', 'socialMediaLinks']

    def get_image(self, obj):
        request = self.context.get('request')
        photo_url = obj.image.url
        return request.build_absolute_uri(photo_url)

    def get_social_media_links(self, model):
        return "some data"