Использование Django 4.1 async orm в FastAPi

В версии 4.1 некоторые асинхронные вещи были добавлены в orm часть Django. Я хочу использовать Django orm в fastAPi, я создал небольшой файл настроек для использования Django orm следующим образом:

import os
import sys
import django
from django.conf import settings

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
INSTALLED_APPS = [
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'orm',
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'pass',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}
settings.configure(
    DATABASES = DATABASES,
    INSTALLED_APPS = INSTALLED_APPS,
)
django.setup()

if __name__ == "__main__":
    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Я хочу выполнить запрос в основном файле следующим образом в FastApi:

@app.get("/test-orm")
async def test_django_orm():
    results = await User.objects.filter(username="user0")
    paginator = Paginator(results, 2)
    paginated = json.loads(serializers.serialize('json', paginator.page(1)))
    return {"data": paginated}

Этот код просто не работает! Если я убираю async и await, то он работает отлично, но я пишу, чтобы использовать async дружественный код! Любая помощь и идеи приветствуются :)

Как вы могли прочитать в документации или других связанных темах в SO, вы должны использовать функцию sync_to_async из asgiref. Посмотрите здесь:

Самый лучший подход к использованию Django ORM с async?

и здесь в документации: https://docs.djangoproject.com/en/4.0/topics/async/#asgiref.sync.sync_to_async

https://docs.djangoproject.com/en/4.0/topics/async/#async-views

вы можете использовать модуль django-async-orm для асинхронных вызовов БД.

и вы можете прочитать документацию здесь: https://github.com/rednaks/django-async-orm

Единственная проблема с модулем заключается в том, что он все еще находится на стадии разработки, что означает, что он не предназначен для производства.

Вернуться на верх