Использование 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
Единственная проблема с модулем заключается в том, что он все еще находится на стадии разработки, что означает, что он не предназначен для производства.