Very optional: You might be able to make the code a bit cleaner by having this method take kwargs for additional data to include in the serialization. Then later, you can consolidate the use pattern to something like:

    return Response(
        _serialize_group(group, uri=request.path + '/' + str(group_id))
        status=status.HTTP_201_CREATED
    )

and

    return Response(
        {
            'message': ...,
            'field_conflict': 'name',
        },
        status=status.HTTP_409_CONFLICT
    )

The benefit there is that it makes it more obvious exactly what data is in the response, rather than having to look back to see what data might have collected over the course of the view function.

And, in fact, you could probably get rid of the `if group: ... else: ...` clause entirely, and push the returns up directly after you either have or don't have the group object.