Saving a model serializer with a nested relationship with Django Rest Framework -
i have following:
class clientsubscription(models.model): activity = models.foreignkey(activity) client = models.foreignkey(client) subscription_date_start = models.datefield(blank = true, null = true) subscription_date_end = models.datefield(blank = true, null = true) class meta: unique_together = ('activity', 'client') as following serializers:
class activityserializer(serializers.modelserializer): activity_slug = serializers.charfield(read_only = true, required=false) activity_type = serializers.primarykeyrelatedfield(read_only = true) activity_name = serializers.charfield(read_only = true, source = 'activity_type', required=false)\ is_active = serializers.booleanfield(required=false) class meta: model = activity fields = ('id', 'activity_type', 'is_active', 'activity_name', 'activity_slug') class clientsubscriptionserializer(serializers.modelserializer): activity = activityserializer(read_only=false) client = serializers.primarykeyrelatedfield(queryset=client.objects.all()) subscription_date_start = serializers.datefield(format="%y-%m-%d") subscription_date_end = serializers.datefield(format="%y-%m-%d") class meta: model = clientconcernedsubscriptions fields = ('id', 'activity', 'client', 'subscription_date_start', 'subscription_date_end') everything in terms of serialization going great - not able validate or save deserialized data, , following error:
typeerror: int() argument must string or number, not 'ordereddict' i have looked @ this, don't seem able use solution.
this received data:
{u'subscription_date_end': u'2015-10-01', 'client': 8, u'subscription_date_start': u'2014-10-01', u'activity': {u'activity_name': u'name', u'is_active': true, u'id': 14597, u'activity_slug': u'slug', u'activity_type': u'9'}, u'id': 58782} i sure must common do, , doing stupid. able save object, able alter fields on related field.
this because unique validator in rest_framework expect integer value nested relations, if make custom serializer related field, deserialization provides dict instead primary key value.
so made solution , hope helps too.
create custom validator this:
class uniquetogethernestedvalidator(object): def __init__( self, queryset=none, simple_fields=none, dict_fields=none, message='not unique value'): if queryset none or simple_fields none or dict_fields none: raise typeerror( '__init__() missing 3 required positional arguments: \ \'queryset\', \'simple_fields\' , \'dict_fields\'' ) else: self.queryset = queryset self.simple_fields = simple_fields self.dict_fields = dict_fields self.message = message def __call__(self, value): unique = {} f in self.simple_fields: unique[f] = value[f] f in self.dict_fields: unique['{}__id'.format(f)] = value[f]['id'] print(unique) if self.queryset.filter(**unique).exists(): raise serializers.validationerror(self.message) and call meta in serializer providing @ least queryset, simple_fields (fields de model) , dict_fields (nested fields).
Comments
Post a Comment