2

I'm using the Django rest framework to create an API. Say I have the following models:

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __unicode__(self):
        return self.name


class Item(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, related_name='items')

    def __unicode__(self):
        return self.name

I want to write a serializer for Item such that it returns "category_name" during serialization (i.e. read) but then also takes "category_name" back and converts it into category during deserialization (i.e. write) [you can assume that category_name is unique in its table]

I was able to find this link which solves the problem for reads but doesn't work for writes.

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.CharField(source='category.name')

    class Meta:
        model = Item
        fields = ('id', 'name', 'category_name')

Is there a way to modify it such that it can be used to populate new items via an API?

Nikhil Garg
  • 3,944
  • 9
  • 30
  • 37

1 Answers1

3

SlugRelatedField is what you're looking for. This is both read and write.

class ItemSerializer(serializers.ModelSerializer):
    category = serializers.SlugRelatedField(
        slug_field='name',
        queryset=Category.objects.all()
     )

    class Meta:
        model = Item
        fields = ('id', 'name', 'category')

Precision: you need to make your category.name unique=True in your models.py.

Guillaume
  • 1,956
  • 1
  • 7
  • 9