0

У меня есть этот сериализатор и модель. Я хочу показать в своем API поле имя пользователяПользователь модель, но я получаю эту ошибку.Django Rest Framework slug_field error

AttributeError at /api/v1/client_share_requests/1/

'Profile' object has no attribute 'username'

serializers.py

class ClientShareRequestSerializer(serializers.ModelSerializer): 

    checked_by = serializers.SlugRelatedField(
     many=True, 
     queryset=Profile.objects.all(), 
     slug_field='username' 
    ) 

    class Meta: 
     model = ClientShareRequest 
     fields = ('checked_by') 

models.py

class Profile(models.Model): 
     user = models.OneToOneField(User, related_name='profile') 

    class ClientShareRequest(models.Model): 
     checked_by = models.ManyToManyField(Profile, blank=True, 
              related_name='checked_by') 

Я пытаюсь получить доступ к экземпляру модели пользователя, как это:

checked_by = serializers.SlugRelatedField(
     many=True, 
     queryset=Profile.objects.all(), 
     slug_field='user.username' 
    ) 

, но я получаю эту ошибку:

'Profile' object has no attribute 'user.username'

Спасибо за помощь. (Извините за мой английский: P)

+1

Попробуйте 'user__username'. –

+0

@RahulGupta не работает. Объект 'Profile' не имеет атрибута 'user__username'' – FACode

ответ

0

Мое предположение, что DRF не разрешает поиск вложенных атрибутов на SlugRelatedFields. Простой обходной путь будет добавить свойство имени пользователя на модели профиля и использовать это в сериализаторе:

class Profile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 

    @property 
    def username(self): 
     return self.user.username 

class ClientShareRequest(models.Model): 
    checked_by = models.ManyToManyField(Profile, blank=True, 
              related_name='checked_by') 


class ClientShareRequestSerializer(serializers.ModelSerializer): 

    checked_by = serializers.SlugRelatedField(
     many=True, 
     read_only=True, 
     slug_field='username' 
    ) 

    class Meta: 
     model = ClientShareRequest 
     fields = ('checked_by',) 

Это работает для чтения :)

Смежные вопросы