Serializing data from a method using the Django Rest Framework

I am having trouble understanding how it Django Rest Frameworkprocesses related model instances when they serialize data.

For example, I have two models that are associated with django `User ':

from django.contrib.auth.models import User
from django.db import models

class UserStatus(models.Model):
    user = models.ForeignKey(User)
    created = CreationDateTimeField()

    def is_anonymous(self):
        return self.user.userprofile.anonymous_user


class UserProfile(models.Model):
    user = models.OneToOneField(User)
    anonymous_user = models.BooleanField(default=False)

If I serialize a model instance using the following approach, it works fine:

from rest_framework import serializers

class UserStatusSerializer(serializers.ModelSerializer):
    get_anonymous = serializers.SerializerMethodField('get_anonymous_state')

    def get_anonymous_state(self, obj):
        return self.object.user.userprofile.anonymous_user

    class Meta:
        model = UserStatus
        fields = ('id', 'get_anonymous',)

My opinion on calling a serializer is structured as follows:

def put(self, request, *args, **kwargs):
        user = self.request.user
        serializer = UserStatusSerializer(self.model.objects.filter(user=user, data=request.DATA)

        if serializer.is_valid():
                new_serializer = UserStatusSerializer(user)
                return Response(new_serializer.data, status=status.HTTP_200_OK)

If I try to use a method existing in the model UserStatus, I get an error message:

class UserStatusSerializer(serializers.ModelSerializer):
    is_anonymous = serializers.Field(source='is_anonymous')

    class Meta:
        model = UserStatus
        fields = ('id', 'is_anonymous',)

In the second approach, I get an error message:

Exception Value: UserStatus has no user

, . PUT , (, , self.user.userprofile.anonymous_user); , . , . , ?

+4
1

is_anonymous = serializers.Field(source='user.userprofile.is_anonymous')

?

+3

Source: https://habr.com/ru/post/1534571/


All Articles