I want to create a mixin for additional fields in Modelserializer. Please refer the code below
class AdditionalFieldsMixin(object):
additional_fields = dict()
def __init__(self, *args, **kwargs):
super(AdditionalFieldsMixin, self).__init__(*args, **kwargs)
for field_name, field_instance in self.additional_fields.items():
self.fields[field_name] = field_instance
print(self.fields)
def additional_field_before_create(self, additional_field_data):
pass
def additional_field_after_create(self, additional_field_data, instance):
pass
def additional_field_before_update(self, additional_field_data):
pass
def additional_field_after_update(self, additional_field_data, instance):
pass
def create(self, validated_data):
additional_field_data = {}
for additional_field in self.additional_fields.keys():
additional_field_data[additional_field] = validated_data.pop(additional_field, None)
self.additional_field_before_create(additional_field_data)
instance = super(AdditionalFieldsMixin, self).create(validated_data)
self.additional_field_after_create(additional_field_data, instance)
return instance
def update(self, instance, validated_data):
additional_field_data = {}
for additional_field in self.additional_fields.keys():
additional_field_data[additional_field] = validated_data.pop(additional_field, None)
self.additional_field_before_update(additional_field_data)
instance = super(AdditionalFieldsMixin, self).update(instance, validated_data)
self.additional_field_after_update(additional_field_data, instance)
return instance
In main class I declared
additional_fields = dict(
reference=CharField(write_only=True, allow_blank=True, allow_null=True, default=None),
)
but when retrieving the data in list mode the it gives me an error
AssertionError: It is redundant to specify `source='reference'` on field 'CharField' in serializer 'MySerializer', because it is the same as the field name. Remove the `source` keyword argument.
why this is happening ? also i noted that after starting runserver first time it doesn't give that error but if I query again it gives error second time and so on.
and another general question
what is the proper way to add fields in seialiser mixin class ? i.e self.fields[field_name] = field_instance is right way to do it?