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

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

01.03.2023, 09:39. Показов 1522. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru