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:
one 1 relationship - in parent serializer definition, can specify paramter
many=false
.delete child object when parent deleted - in parent serializer, implement
perform_destroy
function. in function, delete parent instance , child instance.
Comments
Post a Comment