Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 15.10.2015
Сообщений: 112

JSON поле в peewee + pydantic (FastAPI)

01.03.2023, 09:39. Показов 1598. Ответов 3

Студворк — интернет-сервис помощи студентам
Доброго времени. Проблема следующая.
Есть приложение на FastAPI, в котором описаны модели таблиц БД на peewee. Одно поле требуется сделать типа JSON, и эта возможность, исходя из документации, есть у дополнительного модуля для баз postgresql - postgres_ext. Выглядит следующим образом:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from peewee import Model, CharField, DateField, BooleanField, ForeignKeyField, Field
from playhouse.postgres_ext import JSONField
 
 
class TeacherContest(BaseModel):
    teacher = ForeignKeyField(User, backref='users')
    contest = ForeignKeyField(Contest, backref='contests')
    nomination = CharField()
    union = CharField()
    collective = BooleanField()
    participants = JSONField()
    created = DateField(default=datetime.date.today())
 
    class Meta:
        db_table = 'teacher_contests'
Далее, схема pydantic так же поддерживает JSON формат, и выглядит следующим образом:

Python
1
2
3
4
5
6
7
8
9
10
11
import peewee
from pydantic import BaseModel, Json
from pydantic.utils import GetterDict
from pydantic.schema import date
 
 
class ContestTeacherCreate(ContestBaseSchema):
    nomination: str
    union: str
    collective: bool
    participants: Json

Ну и наконец сам обработчик запроса выглядит следующим образом:

Python
1
2
3
4
5
@app.post("/contest/create", response_model=ContestTeacherCreate, dependencies=[Depends(get_current_user)])
async def create_contest(create_contest_data: ContestTeacherCreate,
                         current_user: UserSchema = Depends(get_current_user)):
    teacher_contest = create_teacher_contest(current_user, create_contest_data)
    return teacher_contest
И функция
Python
1
create_teacher_contest
, которая распихивает данные по таблицам в БД:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def create_teacher_contest(user: UserSchema, teacher_contest: ContestTeacherCreate) -> ContestTeacher:
    contest_id = None
    try:
        contest = Contest.get_or_none(name=teacher_contest.name)
        if contest:
            pass
        else:
            contest = Contest.create(name=teacher_contest.name,
                                     level=teacher_contest.level,
                                     distant=teacher_contest.distant,
                                     place=teacher_contest.place,
                                     date=teacher_contest.date)
            contest.save()
        contest_id = contest.get_id()
    except IntegrityError:
        pass
    teacher_contest = TeacherContest.create(teacher=user.id,
                                            contest=contest_id,
                                            nomination=teacher_contest.nomination,
                                            union=teacher_contest.union,
                                            collective=teacher_contest.collective,
                                            participants=teacher_contest.participants)
    teacher_contest.save()
    contest_teacher = User.get_by_id(teacher_contest.teacher_id)
    result = ContestTeacher(teacher=' '.join([contest_teacher.surname, contest_teacher.name,
                                              contest_teacher.patronymic]),
                            contests=TeacherContest.filter(TeacherContest.teacher == teacher_contest.teacher_id))
    return result

Так вот, проблема в том, что при отправке данных обработчик возвращает ответ -
Python
1
"JSON object must be str, bytes or bytearray"
. И естественно в БД это поле не заполняется. Прошу помочь подсказать, в чем может быть проблема. Я так понимаю что не проходит валидация pydantic, но почему - не понимаю, ведь отправляю в запросе JSON
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2023, 09:39
Ответы с готовыми решениями:

Связать поле title из JSON Schema с JSON-данными
Добрый день! Подскажите пожалуйста, можно ли как-то связать поле title из JSON Schema для атрибута из JSON данных? См. Скрин. 1-...

Каким методом из Newtonsoft.Json можно найти в строке формата JSON нужное поле и заменить в ней значение ?
У меня есть строка символов в формате JSON. Ну, например: "ID":"00000000-0000-0000-0000-000000000000", "Price":0.0,...

FastAPI и matplotlib
Напишите API сервис используя фреймворк FastAPI Он должен уметь принимать данные (На ваше усмотрение) и в ответ выдавать...

3
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
01.03.2023, 10:54
Challenger85, код не стал глядеть, не читабельный, но вроде же понятно написано, что json-объект должен быть строкой или массивом байт, ак преобразуй свой "словарь" типа json в нужную форму, например:

Python
1
2
3
import json
 
json_string = json.dumps({"Key": "Value"})
0
1 / 1 / 1
Регистрация: 15.10.2015
Сообщений: 112
01.03.2023, 11:30  [ТС]
Проблема в том что я не до конца понимаю, на каком именно этапе JSON не принимается. То ли на этапе валидации в pydantic, то ли на этапе записи в базу через модель peewee. Но скорее всего первое, потому что дебагинг показывает что обработчик даже не запускается.
В этом случае преобразование в, как вы сказали, "нужную форму" делать нужно еще на этапе валидации pydantiс. А как это сделать я пока не могу допетрить. Но спасибо хоть на чем-то, буду думать дальше.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
02.03.2023, 11:17
Challenger85, я мало работал с моделями и очень поверхностно, поэтому не могу вникнуть в суть дела, так что могу только очевидные вещи сказать: я бы изначально глянул в каком виде принимается запрос, что приходит в модель, если в pydantic не проходит валидация. Возможно он ждет json-объект(словарь) на входе, а получает json-строку(байты), а может наоборот.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2023, 11:17
Помогаю со студенческими работами здесь

FastAPI и сериалайзеры
В моём проекте три таблицы. Нужно сформировать ответ который дергает инфу сразу из всех трёх таблиц. Есть ли какое-то элегантное решение...

FastAPI и pytest
Использовал инструкцию https://www.fastapitutorial.com/blog/unit-testing-in-fastapi/ но что-то не взлетело conftest.py: import...

Поле из json
Приветствую смотрящих! Столкнулся с такой проблемой, обращаясь к url получаю ответ:...

Django vs. Flask vs. FastAPI
Какой фреймворк выбрать начинающему? Какой проще, какой сложнее? Для какого больше дополнительных пакетов на разные случаи жизни есть? У...

Peewee ManyToManyField / ManyToManyQuery
Всем привет! Есть база фильмов. В фильмах задействованы актеры. Связь many-to-many. Работаю с ORM peewee. Задача: написать функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru