python - django rest framework nested objects -


i'm trying find elegant solution problem encountered using django rest framework. have parent model child object , 1 one relationship. our requirements child object optional, can null , can patched null existing value. additionally, if parent object deleted child object should well.

this simple set-up recreates problem:

class childserializer(serializers.modelserializer):     class meta:         model = child   class parentserializer(serializers.hyperlinkedmodelserializer):     class meta:         model = parent      parent_value = serializers.charfield(required=false, max_length=1024)     child = childserializer(read_only=false, required=false, many=false)   class parent(models.model):     class meta:         app_label = "testparent"      parent_value = models.charfield(max_length=1024, null=true, blank=true)   class child(models.model):     class meta:         app_label = "testparent"      child_value = models.charfield(max_length=1024, null=true, blank=true)     parent = models.foreignkey(parent, null=true, blank=true, related_name="child")   class parentviewset(viewsets.modelviewset):     permission_classes = (allowany,)      queryset = parent.objects.all()     serializer_class = parentserializer 

this works:

{     "parent_value": "abc",      "child": { "child_value": "something" } } 

this gets error:

{     "parent_value": "abc",      "child": null } 

note child object optional , default rest framework populates field null.

i'm using django v.1.5.4 , rest framework v.2.3.13

the error:

traceback: file "{site-packages}/django/core/handlers/base.py" in get_response   115.                         response = callback(request, *callback_args, **callback_kwargs) file "{site-packages}/rest_framework/viewsets.py" in view   78.             return self.dispatch(request, *args, **kwargs) file "{site-packages}/django/views/decorators/csrf.py" in wrapped_view   77.         return view_func(*args, **kwargs) file "{site-packages}/rest_framework/views.py" in dispatch   400.             response = self.handle_exception(exc) file "{site-packages}/rest_framework/views.py" in dispatch   397.             response = handler(request, *args, **kwargs) file "{site-packages}/rest_framework/mixins.py" in create   54.             self.object = serializer.save(force_insert=true) file "{site-packages}/rest_framework/serializers.py" in save   596.             self.save_object(self.object, **kwargs) file "{site-packages}/rest_framework/serializers.py" in save_object   1023.                     setattr(obj, accessor_name, related) file "{site-packages}/django/db/models/fields/related.py" in __set__   474.         manager.add(*value)   exception value: add() argument after * must sequence, not nonetype 

the workaround we're using have onetoone field parent , use post_delete signal handler delete child object. feels hacky. we've in general have encountered few issues trying manipulate nested objects , wondering if we're going wrong or if maybe in case we've encountered bug in either django or rest framework.

thanks!

while question asked year ago, django rest framework has released major update (3.1.1) since simplifies , enhances how framework deals nested objects.

your requirements:

  1. one 1 relationship - in parent serializer definition, can specify paramter many=false.

  2. delete child object when parent deleted - in parent serializer, implement perform_destroy function. in function, delete parent instance , child instance.

here drf serializer documentation


Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

inno setup - TLabel or TNewStaticText - change .Font.Style on Focus like Cursor changes with .Cursor -