Как получить данные из реляционной модели OneToOne в DRF с помощью представления API

Я импортировал модель User и настроил ее в соответствии с моими потребностями и создал связь OneToOne с моделью UserProfileModel. При извлечении данных я получил следующую ошибку. "Поле сериализатора может быть названо неправильно и не соответствовать какому-либо атрибуту или ключу экземпляра AnonymousUser. Оригинальный текст исключения был: 'AnonymousUser' object has no attribute 'gender'."

Моя модель:

class UserProfileModel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='userprofilemodel')
    gender = models.CharField(max_length=20)
    locality = models.CharField(max_length=70)
    city = models.CharField(max_length=70)
    address = models.TextField(max_length=300)
    pin = models.IntegerField()
    state = models.CharField(max_length=70)
    profile_image = models.FileField(upload_to='user_profile_image', blank=True)

Мой сериализатор выглядит так:

class UserProfileSerializer(serializers.ModelSerializer):

class Meta: 
    model= User 
    fields = ['id', 'name' , 'email','mobile',]

class UserProfileModelSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField(many=True, read_only=True)
    class Meta: 
        model= UserProfileModel 
        fields = ['user','gender' , 'locality','city','address','pin','state','profile_image', ]

Мое представление выглядит следующим образом: class UserProfileDataView(APIView):

def get(self, request, format=None):
    # user = UserProfileModel.objects.all()
    serializer = UserProfileModelSerializer(request.user)
    return Response(serializer.data, status=status.HTTP_200_OK)

Я хочу получить данные профиля зарегистрированного пользователя, используя модель UserProfileModel Model

проблема здесь в том, что вы передаете анонимного пользователя, у которого нет профиля (вы разрешаете неаутентифицированным пользователям доступ к этому представлению)

def get(self, request, format=None):
    # user = UserProfileModel.objects.all()
    if request.user.is_authenticated:
        serializer = UserProfileModelSerializer(request.user)
        return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        return Response({}, status=status.HTTP_200_OK)

Ваша первая проблема в том, что вы передаете экземпляр User в UserProfileModelSerializer, который ожидает экземпляр UserProfileModel. Чтобы исправить это, вам нужно изменить:

serializer = UserProfileModelSerializer(request.user)

to

serializer = UserProfileModelSerializer(request.user.userprofilemodel)

где userprofilemodel - это related_name, которое вы установили на поле user в вашем UserProfileModel.

Вторая проблема заключается в том, что, как сказал Мохамед Белтаги, вы позволяете любому получить доступ к представлению, включая неаутентифицированных пользователей. Django rest framework имеет встроенный миксин, который вы можете использовать для ограничения доступа только аутентифицированным пользователям (https://www.django-rest-framework.org/api-guide/permissions/#isauthenticated).

from rest_framework.permissions import IsAuthenticated


class UserProfileDataView(APIView):
    permission_classes = [IsAuthenticated]
Вернуться на верх