Невозможно сериализовать объект Django с экземпляром JsonResponse. - PullRequest
0 голосов
/ 03 мая 2019

Этот вопрос, кажется, задавался несколько раз на SO, но ни один из ответов, похоже, не работает.

У меня есть эта модель:

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Post(BaseModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content_url = models.URLField(null=False)

и я пытаюсь сериализовать его в JSON здесь:

def create_post(request):
    post_content = request.body
    post_content_url = save_post(post_content) # returns a string

    post = Post.objects.create(user=request.user, content_url=post_content_url)
    post.save()

    return JsonResponse({"post": post})

Когда я делаю это, я получаю следующую ошибку:

TypeError: Object of type Post is not JSON serializable

Что я делаю не так? Предполагается, что класс JsonResponse выводит объект в json:

class JsonResponse(HttpResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if safe and not isinstance(data, dict):
            raise TypeError(
                'In order to allow non-dict objects to be serialized set the '
                'safe parameter to False.'
            )
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)

Пожалуйста, помогите. Согласно всему, что я прочитал, это должно работать.

1 Ответ

0 голосов
/ 03 мая 2019

Здесь post является экземпляром класса Post (в частности, класс модели), и это не сериализуемый .

Но вы можете использовать Сериализатор Django для сериализации ваших объектов

<b>from django.core import serializers
import json</b>


def create_post(request):
    post_content = request.body
    post_content_url = save_post(post_content)  # returns a string

    post = Post.objects.create(user=request.user, content_url=post_content_url)
    post.save()
    <b>data = serializers.serialize('json', [post], fields=('user', 'content_url'))</b>

    return JsonResponse(<b>{"post": json.loads(data)}</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...