Как получить данные из реляционной модели 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]