Skip to content

Instantly share code, notes, and snippets.

@chriscdn
Forked from tomchristie/put_as_create.py
Created November 12, 2015 14:37

Revisions

  1. chriscdn revised this gist Nov 12, 2015. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion put_as_create.py
    Original file line number Diff line number Diff line change
    @@ -16,7 +16,7 @@ def update(self, request, *args, **kwargs):
    serializer.save(**extra_kwargs)
    return Response(serializer.data, status=status.HTTP_201_CREATED)

    serializer.save()
    self.perform_update(serializer)
    return Response(serializer.data)

    def partial_update(self, request, *args, **kwargs):
  2. @tomchristie tomchristie created this gist Nov 3, 2014.
    40 changes: 40 additions & 0 deletions put_as_create.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,40 @@
    class AllowPUTAsCreateMixin(object):
    """
    The following mixin class may be used in order to support PUT-as-create
    behavior for incoming requests.
    """
    def update(self, request, *args, **kwargs):
    partial = kwargs.pop('partial', False)
    instance = self.get_object_or_none()
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    serializer.is_valid(raise_exception=True)

    if instance is None:
    lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
    lookup_value = self.kwargs[lookup_url_kwarg]
    extra_kwargs = {self.lookup_field: lookup_value}
    serializer.save(**extra_kwargs)
    return Response(serializer.data, status=status.HTTP_201_CREATED)

    serializer.save()
    return Response(serializer.data)

    def partial_update(self, request, *args, **kwargs):
    kwargs['partial'] = True
    return self.update(request, *args, **kwargs)

    def get_object_or_none(self):
    try:
    return self.get_object()
    except Http404:
    if self.request.method == 'PUT':
    # For PUT-as-create operation, we need to ensure that we have
    # relevant permissions, as if this was a POST request. This
    # will either raise a PermissionDenied exception, or simply
    # return None.
    self.check_permissions(clone_request(self.request, 'POST'))
    else:
    # PATCH requests where the object does not exist should still
    # return a 404 response.
    raise