Django DRF - Вложенные сериализаторы для моделей, связанных с OneToOne, приводят к ошибке KeyError при получении объектов данных
Фон
У меня есть отношение OneToOne между типом пользователя (UsertypeA) и моим пользовательским базовым пользователем (UserProfile). Однако, есть проблема, когда я обращаюсь к конечной точке API для получения всех объектов типа UsertypeA, я продолжаю получать "Got KeyError when attempting to get a value for field 'user' on serializer UserTypeASerializer. The serializer field might be named incorrectly and not match any attribute or key on the 'dict' instance. Original exception text was: 'usertypeA'."
Я пытался и следовал Django-OneToOne-Relations и DRF-nested-serializers документации настолько, насколько мог, но все еще не могу найти проблему в логике ниже, и почему мой атрибут UserTypeA.user не сериализуется
- UserProfile:
# models.py
class UserProfile(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=150, unique=True)
...
# serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
fields = ('email', 'username', 'first_name', 'last_name', ...)
model = UserProfile
def create(self, validated_data):
return UserProfile.objects.create_user(validated_data)
def update(self, instance, validated_data):
return UserProfile.objects.update_user(instance, validated_data)
- UserTypeA
# models.py
class UserTypeA(models.Model):
usertypeA_uuid = models.UUIDField(
primary_key=True, default=uuid.uuid4, editable=False)
user = models.OneToOneField(
UserProfile, on_delete=models.CASCADE, related_name='usertypeA', related_query_name='usertypeA')
...
@property
def username(self):
return self.user.username
def __str__(self):
return str(self.usertypeA_uuid)
# serializers.py
class UserTypeASerializer(serializers.ModelSerializer):
user = UserSerializer(required=True, source='usertypeA')
class Meta:
fields = ('usertypeA_uuid', 'user', 'membership_type' ...)
model = UsertypeA
depth = 1
def create(self, validated_data):
....
def update(self, instance, validated_data):.
....
# views.py
class UserTypeAView(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]
serializer_class = UserTypeASerializer
def get_queryset(self):
return UserTypeA.objects.all().values()
- когда я пытался использовать
return UserTypeA.objects.filter(usertypeA_uuid=...)
в userTypeA/views.py, вместо этого я получал следующую ошибку .
Got AttributeError when attempting to get a value for field `user` on serializer `UserTypeASerializer`...
- Наконец, если я установлю атрибут user в
UserTypeASerializer
вread_only
, то ошибка исчезнет, но это не то, что я хочу, я хочу видеть UserTypeA и связанные с ним данные пользователя при обращении к конечной точке API
Вопрос
- Why isn't the UserTypeA.user attribute not properly serialized by the nested serializer?
- How to properly debug such issues, (Shell, Postman, placing loggers?) I am sorry I am still quite new to django/DRF