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

Вопрос

  1. Why isn't the UserTypeA.user attribute not properly serialized by the nested serializer?
  2. How to properly debug such issues, (Shell, Postman, placing loggers?) I am sorry I am still quite new to django/DRF
Вернуться на верх