Naterz
Naterz

Reputation: 437

how to get a username to show on serializer django rest framework

how would i get the user name to show in the serializer along wit the data. I tried doing serializer char field but did not work.

Model

class Pet(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,
                              null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)

serializer

class PetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Pet
        fields = '__all__'

view set:

class PetViewSet(viewsets.ModelViewSet):
    queryset = Pet.objects.all()
    permission_classes = [
        permissions.AllowAny
        # permissions.IsAuthenticated,
    ]
    serializer_class = PetSerializer

what i tried:

class PetSerializer(serializers.ModelSerializer):
    username = serializers.CharField(
        source = "users.username", read_only = True
    )
    class Meta:
        model = Pet
        fields = '__all__'


expected result:

 {
        "id": 1,
        "title": "dog",
         "owner": 1,
         "username": "someusername"


    },

Upvotes: 0

Views: 4536

Answers (5)

Ayush Chaurasia
Ayush Chaurasia

Reputation: 1

To get the username instead of user id we can make this happen by a few change in serliazers.py

class ProductSerializer(ModelSerializer):
    user=serializers.CharField(source="user.username")  # here we will point user.username to get user's name and save it in user
    class Meta:
        model=Product
        fields=['id','user','pname','category','description','price']

Upvotes: 0

Eng . Thales Dias
Eng . Thales Dias

Reputation: 1

In serializers.py

class PetSerializer(serializers.ModelSerializer):
  owner_username = serializers.SerializerMethodField('get_owner_username')

  def get_owner_username(self, model):

    return  model.owner.username

  class Meta:

      model = Pet

      fields = '__all__'

Upvotes: 0

Naterz
Naterz

Reputation: 437

username = serializers.CharField(
        source="owner.username", read_only=True)

I needed to get the foreign key, which is owner, and then put username in this serializer.

Upvotes: 3

Sandeep Agrawal
Sandeep Agrawal

Reputation: 175

class PetSerializer(serializers.ModelSerializer):

    def getUsername(self, obj):
        return obj.user.username

    username = serializers.SerializerMethodField("getUsername")

    class Meta:
        model = Pet
        fields = ('id','username', 'title', 'text', 'created_at', 'update_at')
        read_only_fields = ('id',)

Upvotes: 1

Mukul Kumar
Mukul Kumar

Reputation: 2103

You need to add a new field in your serializer by using 'SerializerMethodField'

username = serializers.SerializerMethodField("get_username")

This function will return the username for the serializer:

def get_username(self, obj):
    return obj.owner.username

Upvotes: 1

Related Questions