Majid Abdolhosseini
Majid Abdolhosseini

Reputation: 2301

Django rest framework remove a field from API Create form

I have a model and viewset related to this model, here is my code :

class EMAILTemplate(models.Model):
    """ Message SMS Template """
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    body = models.TextField()
    tokens = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs):
        self.tokens = ",".join(re.findall(r'{{\s*(.*?)\s*}}', self.body))
        super().save(*args, **kwargs)

I don't want field tokens to be in my create form in Django rest framework create or edit form, because as you see It's going to be extracted from body field. but I want to have this field in view single model or list of models.

and here is my ModelSerializer :

class EmailTemplateSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = EMAILTemplate
        fields = ('name', 'body', 'user', 'tokens')

Upvotes: 1

Views: 1432

Answers (2)

Arghya Saha
Arghya Saha

Reputation: 5713

You can overwrite the current to_representation method

class EmailTemplateSerializer(serializers.HyperlinkedModelSerializer):

    def to_representation(self, obj):
        try:
            if self.context['view'].action in ['list', 'detail']:
                # get the original representation
                ret = super(serializers.HyperlinkedModelSerializer, self).to_representation(obj)
                # remove 'tokens' field
                ret.pop('tokens')
                return ret
        except KeyError:
            return super(serializers.HyperlinkedModelSerializer, self).to_representation(obj)
        return super(serializers.HyperlinkedModelSerializer, self).to_representation(obj)

Upvotes: 1

neverwalkaloner
neverwalkaloner

Reputation: 47364

You can specify tokens as read only field:

class EmailTemplateSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = EMAILTemplate
        fields = ('name', 'body', 'user', 'tokens')
        read_only_fields = ('tokens',)

Upvotes: 5

Related Questions