Поле выбора Django не возвращает данные через конечные точки API

У меня есть пользовательская модель User и модель Profile. В модели профиля у меня есть 4 атрибута:

  1. owner - отношение OnetoOne с CustomUser
  2. .
  3. gender - IntegerField с кортежем вариантов. т.е.: (1, 'Male'), по умолчанию=1
  4. city - CharField
  5. страна - CharField

Сериализатор определен с полями '__all__'. Но конечная точка API возвращает:

{
    "id": 5,
    "city": null,
    "country": null
}

Я ожидаю, что API вернет все поля, определенные в Profile Model. примерно так:

{
    "id": 5,
    //Here I'm expecting the owners(CustomUser) Fields under user key
    "gender": 1,
    "city": null,
    "country": null

}

для лучшего понимания, пожалуйста, посмотрите на код.

Моя пользовательская модель пользователя:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    avatar = models.ImageField(upload_to="avatars/", null=True, blank=True)
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomBaseUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    def get_full_name(self):
        return self.name

    def __str__(self):
        return self.email

Модель профиля:

GENDERS = (
    (1, 'Male'),
    (2, 'Female'),
    (3, 'Other'),
)
class Profile(models.Model):
    """Model for users profile"""
    owner = models.OneToOneField(
        CustomUser, 
        on_delete=models.CASCADE, 
        related_name='profile'
    )
    gender = models.IntegerField(_('Gender'), default=1, choices=GENDERS)
    city = models.CharField(_('City'), max_length=255, null=True, blank=True)
    country = models.CharField(_('Country'), max_length=255, null=True, blank=True)

    def __str__(self):
        return f'profile-{self.id}-{self.owner.get_full_name()}'

Сериализатор профиля:

class ProfileSerializer(serializers.ModelSerializer):
    """Serializer for retrieve update and delete profile"""
    class Meta:
        model = Profile
        fields = '__all__'
        read_only_fields = ('owner', )

Просмотр API профиля:

class ProfileAPIView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = ProfileSerializer
    queryset = User.objects.all()

    def get_object(self):
        return get_object_or_404(User, id=self.request.user.id, is_active=True)

Думаю, вам нужно использовать функцию get_gender_display в сериализаторе.

class ProfileSerializer(serializers.ModelSerializer):
    gender = serializers.SerializerMethodField()

    class Meta:
        model = Profile
        fields = '__all__'
        read_only_fields = ('owner', )

    def get_gender(self, obj):
        return obj.get_gender_display()
Вернуться на верх