Поле выбора Django не возвращает данные через конечные точки API
У меня есть пользовательская модель User и модель Profile. В модели профиля у меня есть 4 атрибута:
- owner - отношение OnetoOne с CustomUser .
- gender - IntegerField с кортежем вариантов. т.е.: (1, 'Male'), по умолчанию=1
- city - CharField
- страна - 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()