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); , . , . , ?