blaz1988
blaz1988

Reputation: 366

How to exclude blank attributes from Django Rest?

I have, in models.py :

class Bedrooms_types(models.Model):
    bedrooms_type = models.CharField(max_length=100)

    def __str__(self):              # __unicode__ on Python 2
        return self.bedrooms_type

    class Meta:
        ordering = ('bedrooms_type',)

class Buildings(models.Model):
    name = models.CharField(max_length=300)
    category=models.CharField(max_length=200)
    type=models.CharField(max_length=200)
    bedrooms_types = models.ManyToManyField(Bedrooms_types)
    bedrooms = models.CharField(max_length=200,blank=True)
    owner = models.CharField(max_length=200,blank=True)
    construction_date = models.DateField(null=True,blank=True)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

    class Meta:
        ordering = ('name',)

and in serializers.py :

class BuildingSerializer(serializers.ModelSerializer):

bedrooms_types = serializers.RelatedField(many=True)

when I load url /building/ I get:

[{"bedrooms_types": ["grande-suite", "junior-suite"], "id": 1, "name": "Hilton", "category": "hotel", "type": "4-star", "bedrooms": "100", "owner": "", "construction_date": null}]

Fields bedrooms, construction_date and owner can be empty. How to change serializer.py to not show these fields when they are empty?

For this example, I want to get:

[{"bedrooms_types": ["grande-suite", "junior-suite"], "id": 1, "name": "Hilton", "category": "hotel", "type": "4-star", "bedrooms": "100", "}]

Upvotes: 0

Views: 2700

Answers (2)

towr
towr

Reputation: 4167

You can override to_representation to clean up the serialized model

class ModelSerializer(serializers.ModelSerializer):

    def to_representation(self, value):
        repr_dict = super(ModelSerializer, self).to_representation(value)
        return OrderedDict((k, v) for k, v in repr_dict.items() 
                           if v not in [None, [], '', {}])

Upvotes: 3

YAtOff
YAtOff

Reputation: 2415

Here is my answer with more details:

from collections import OrderedDict
from rest_framework import serializers
from .models import Buildings

EMPTY_VALUES = ('', None, [], ())

class BuildingSerializer(serializers.ModelSerializer):

    bedrooms_types = serializers.RelatedField(many=True)

    class Meta:
        model = Buildings

    def get_fields(self):
        fields = super(BuildingSerializer, self).get_fields()
        return OrderedDict(
            ((name, field) for name, field in fields.iteritems()
                if getattr(self.object, name) not in EMPTY_VALUES)
        )

Upvotes: 2

Related Questions