Tikli Taba
Tikli Taba

Reputation: 175

Display a different fields of a related field in django rest framework

I have this serializer of a model for Item.

class Item(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=150)
    body = models.TextField(blank=True)
    image = models.ImageField(upload_to=get_upload_file_name, blank=True)

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'user', 'title', 'body', 'image')

    def create(self, validated_data):
        item = Item.objects.create(
            user=self.validated_data['user'],
            title=self.validated_data['title'],
            body=self.validated_data['body'],
            image=self.validated_data['item_image']
        )
        return item

And a user serializer.

class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = (
            'id', 'email', 'password', 'username', 'first_name', 'last_name',
        )
        extra_kwargs = {
            'password': {'write_only': True},
            'id': {'read_only': True}
        }

    def create(self, validated_data):
        user = CustomUser.objects.create(
            email=validated_data['email'],
            username=validated_data['email'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

However in the ItemSerialzer, for the user field, I want to display the id, first_name and last_name of the user. How can I do this? I am sorry if this is a noob question, I am only a beginner. Thank you.

Upvotes: 2

Views: 1787

Answers (1)

Aswin Kumar K P
Aswin Kumar K P

Reputation: 1102

You can use source attribute of DRF to traverse the foreign key fields.

class ItemSerializer(serializers.ModelSerializer):
  user_id = serializers.CharField(source="user.id")
  first_name = serializers.CharField(source="user.first_name")
  last_name = serializers.CharField(source="user.last_name")

  class Meta:
    model = Item
    fields = ('id', 'user', 'title', 'body', 'image','user_id', 'first_name', 'last_name')   

Upvotes: 5

Related Questions