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

Popular posts from this blog

node.js - Using Node without global install -

How to access a php class file from PHPFox framework into javascript code written in simple HTML file? -

java - Null response to php query in android, even though php works properly -