#python #json #django #postgresql #django-rest-framework
Вопрос:
Я новичок в python django. И я пытаюсь создать тестовый сайт с несколькими вариантами ответов. Я вьетнамец, поэтому мои вопросы на вьетнамском языке.
У меня возникли проблемы, когда я пытаюсь вставить ответы на объекты в базу данных.
Моя ошибка:
django.db.utils.DataError: malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: ...answer", "level") VALUES ('Hôm nay ăn gì', '', 1, '{"A": "C...
^
DETAIL: Unexpected array element.
Моя POST
просьба:
{
"title": "Hôm năy ăn gì",
"category": 3,
"choices": {
"A": "Cơm",
"B": "cháo"
},
"answer": "A"
}
Вот мой код в models.py
:
from django.db import models
from django.contrib.postgres.fields import ArrayField
# Create your models here.
class Category(models.Model):
title = models.TextField(null=False, blank=False)
description = models.TextField(null=False, blank=False)
class Question(models.Model):
title = models.TextField(null=False, blank=False)
description = models.TextField(null=False, blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# choices = ArrayField(ArrayField(models.TextField(blank=True)))
choices = models.JSONField(null=False, blank=False)
answer = models.TextField(null=False,blank=False)
level = models.IntegerField(null=True, blank=True)
В views.py
:
from django.db.models import query
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework import viewsets
from app.models import User, Category, Question
from app.serializers import UserSerializer, QuestionSerializer, CategorySerializer
from django.shortcuts import get_object_or_404
# Create your views here.
class CategoryViewSet(viewsets.ModelViewSet):
serializer_class = CategorySerializer
queryset = Category.objects.all()
class QuestionViewSet(viewsets.ModelViewSet):
serializer_class = QuestionSerializer
queryset = Question.objects.all()
В serializers.py
:
from django.contrib.postgres import fields
from rest_framework import serializers
from app.models import User, Question, Category
class CategorySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Category
fields = ['id', 'title', 'description']
class QuestionSerializer(serializers.ModelSerializer):
# category = CategorySerializer(read_only=False)
class Meta:
model = Question
fields = ['id', 'description', 'category', 'choices', 'answer', 'level']
Любое решение для меня, чтобы вставить вьетнамский объект JSON в базу данных. Или я могу использовать arrayField вместо JSONField? Если да, можете ли вы привести мне пример?
Большое спасибо.
Ответ №1:
Мне кажется Question
choices
, что поле модели не было изменено с array
поля на json
поле в базе данных. Итак, то, что вы видите, это:
select '{"A": "Cu01a1m", "B": "chu00e1o"}'::varchar[];
ERROR: malformed array literal: "{"A": "Cu01a1m", "B": "chu00e1o"}"
LINE 1: select '{"A": "Cu01a1m", "B": "chu00e1o"}'::varchar[];
вместо:
select '{"A": "Cu01a1m", "B": "chu00e1o"}'::jsonb;
jsonb
---------------------------
{"A": "Cơm", "B": "cháo"}
В psql
посмотрите на таблицу вопросов и посмотрите, что на самом деле представляет собой поле?
Комментарии:
1. Как я могу это исправить? Можете ли вы дать мне решение?
2. Вы проверили, какой тип столбца находится в базе данных, и если да, то что это такое? Бежать
migrate
?. Трудно сказать без дополнительной информации о том, как вы изменили значение сArrayField
наJSONField
и есть ли в существующем столбце данные?3. Я думаю, что мой тип столбца-jsonb. После того, как я побежал
migrate
, у меня возникла эта проблемаdjango.db.utils.ProgrammingError: cannot cast type text[] to jsonb LINE 1: ...on" ALTER COLUMN "choices" TYPE jsonb USING "choices"::jsonb
.4. Ошибка говорит о том, что текущим типом столбца в базе данных является текстовый массив(
text[]
). В модели есть столбец,JSONField
который переводитсяjsonb
в базу данных. Очевидноmigrate
, что он не справится с этим переходом. Я никогда не работалmigrate
с Django, поэтому я не собираюсь там чем-то помогать. Я бы создал новый вопрос о том, как перенестиtext[]
поле вjsonb
одно.
Ответ №2:
попробуйте это
from django.contrib.postgres.fields import JSONField
class Question(models.Model):
choices = JSONField()