Reputation: 366
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
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
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