By using validate_<field_name>
in serializer level, you can also create an logic to makesure that all fields inside the data
is required to fill.
class ThingsSerializer(serializers.ModelSerializer):
data = serializers.JSONField()
class Meta:
model = Things
fields = ('data', )
def validate_data(self, data):
valid_keys = ('item', 'quantity', 'cost')
errors = []
out_data = {}
for key in valid_keys:
if key in data.keys():
if data.get(key):
out_data[key] = data.get(key)
else:
errors.append({key: 'This field should be filled.'})
else:
errors.append({key: 'This field is required'})
if len(errors) > 0:
raise serializers.ValidationError(errors)
return out_data
Here is the tests:
In [25]: s = ThingsSerializer(data={'data': {'item': 'sugar', 'quantity': 2, 'cost': 20}})
In [26]: s.is_valid()
Out[26]: True
In [27]: s.errors
Out[27]: {}
In [28]: s = ThingsSerializer(data={'data': {'item': 'sugar', 'quantity': 2}})
In [29]: s.is_valid()
Out[29]: False
In [30]: s.errors
Out[30]: {'data': [{'cost': ErrorDetail(string='This field is required', code='invalid')}]}
In [34]: s = ThingsSerializer(data={'data': {'item': 'sugar', 'quantity': 2, 'cost': None}})
In [35]: s.is_valid()
Out[35]: False
In [36]: s.errors
Out[36]: {'data': [{'cost': ErrorDetail(string='This field should be filled.', code='invalid')}]}