Конечная точка DRF возвращает странно сериализованный объект, хотя в представлении он получен правильно
Итак, я использую Django REST auth и dj-rest-auth в качестве бэкенда аутентификации для моего приложения React. В представлении кажется, что он захватывает правильный экземпляр вошедшего пользователя, но это не отражается в ответе. Также если я печатаю поля этого экземпляра, он возвращает неправильные данные, однако экземпляр сериализатора выглядит так, как будто он содержит правильный объект для сериализации... хм
# views.py
class UserDetail(APIView):
"""
Retrieve a User instance
"""
def get(self, request):
print('Header Token: ' + str(request.META['HTTP_AUTHORIZATION']))
print('request.user: ' + str(request.user))
try:
user_profile = UserProfile(user=request.user)
print('user_profile: ' + str(user_profile))
print('user_profile.company: ' + str(user_profile.company)). # Why is this none?
serializer = UserProfileSerializer(user_profile)
print('serializer: ' + str(serializer)) # looks like the instance is correct though..
print('serializer.data: ' + str(serializer.data))
return Response(serializer.data)
except UserProfile.DoesNotExist:
raise Http404
Возвращается
И почтальон возвращается
Но данные должны быть:
# models.py
class UserProfile(models.Model):
"""
Extends Base User via 1-1 for profile information
"""
# Relations
user = models.OneToOneField(User, on_delete=models.CASCADE)
company = models.ForeignKey(Company, on_delete=models.CASCADE, null=True)
# Roles
is_ta = models.BooleanField(default=False) # indicates if user is part of TA department
def __str__(self):
return F'{self.user.first_name} {self.user.last_name}'
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
instance.userprofile.save()
# serializers.py
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = '__all__'
Вы неправильно получаете экземпляр UserProfile, вместо:
user_profile = UserProfile(user=request.user)
try:
user_profile = UserProfile.objects.get(user=request.user)
UPD:
Для создания вложенного представления либо установите атрибут depth в Meta вашего сериализатора:
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = '__all__'
depth = 1
или создайте отдельный сериализатор для связанных полей, например:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = your_fields
и установить сериализатор как поле:
class UserProfileSerializer(serializers.ModelSerializer):
company = CompanySerializer()
class Meta:
model = UserProfile
fields = '__all__'


