FACode
FACode

Reputation: 1061

Django Rest Framework slug_field error

I have this serializer and model. I want to show in my API the field username of User model, but I receive this 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')

I try to access the User model instance like this:

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

but I receive this error:

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

Thanks for helping. (Sorry for my English :P)

Upvotes: 0

Views: 1370

Answers (1)

rtindru
rtindru

Reputation: 5357

My guess is DRF does not allow nested attribute lookups on SlugRelatedFields. Simple workaround would be to add a username property on the Profile model and use this in the serializer:

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', )

This works for reads :)

Upvotes: 1

Related Questions