I had to do this recently because django-tastypie does not support multipart/form-data. klipstein has created Base64FileField to support file uploades by using base64 encoding of file.
Here is an example based on Base64FileField:
#models.py
from django.db import models
class Person(models.Model):
    name = models.CharField("name", max_length=40)
    avatar = models.ImageField("avatar", upload_to="uploads/person_avatars")
    def __unicode__(self):
        return self.name
#views.py
import json
import base64
import sys
from django.core.files.uploadedfile import SimpleUploadedFile
from django.http import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from .models import Person
MAX_SIZE = 10*1024*1024 #10MB
@csrf_exempt
def save_person(request):
    if (request.method == "POST" and request.META.get("CONTENT_TYPE")
        == "application/json"):
        data = json.loads(request.raw_post_data)
        avatar = data.get("avatar")
        file = base64.b64decode(avatar["file"])
        if sys.getsizeof(file) > MAX_SIZE:
            response = {"error": {
                "code": "invalid_request",
                "message": "Max file size exceeded."
                }}
            return HttpResponseBadRequest(json.dumps(response),
                mimetype="application/json")
        person = Person(name=data.get("name"), avatar=SimpleUploadedFile(
            avatar["name"],
            file,
            getattr(avatar, "content_type", "application/octet-stream")))
        person.save()
        response = {"id": person.id, "name": person.name,
            "avatar": person.avatar.url}
        return HttpResponse(json.dumps(response), mimetype="application/json")
    response = {"error": {
        "code": "invalid_request",
        "message": "Method Not Allowed."
        }}
    return HttpResponseBadRequest(json.dumps(response),
        mimetype="application/json")
Here is example JSON body to be posted for above view
{
    "name": "Test User",
    "avatar": {
        "name": "myfile.png",
        "file": "a long base64 encoded string ",
        "content_type": "image/png"
    }
}
and example response is:
{
    "id": 1,
    "avatar": "/media/uploads/person_avatars/myfile.png",
    "name": "Test User"
}
What is the best way?
Not sure if this is the best way, but, it's simple and straightforward.