使用异步 Django ORM 的现代最佳方法?

问题描述 投票:0回答:2

异步 Django 的世界正在迅速变化,很难分辨什么是当前的、什么是过时的。

那么,当前使用 Django ORM(或者可能是另一个 ORM)获得最佳/最流畅异步功能的最佳方法是什么?人们今天成功地使用了什么?

有很多参考资料,包括:

我遇到的一个问题是,无论我尝试什么,我都会遇到“django.db.utils.OperationalError:数据库“test_djangoasyncproj”正在被其他用户访问”问题。

django python-asyncio django-channels
2个回答
7
投票

我认为你应该遵循文档 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

from asgiref.sync import sync_to_async

results = await sync_to_async(Blog.objects.get, thread_sensitive=True)(pk=123)

from asgiref.sync import sync_to_async

def _get_blog(pk):
    return Blog.objects.select_related('author').get(pk=pk)

get_blog = sync_to_async(_get_blog, thread_sensitive=True)

0
投票

如果您使用的是 Django >= 4.2

异步支持

Django 支持编写异步(“async”)视图,以及 如果您正在运行,则具有完全启用异步的请求堆栈 ASGI。异步视图仍然可以在 WSGI 下工作,但性能有所提高 处罚,并且没有能力进行高效的长期运行 请求。

async for author in Author.objects.filter(name__startswith="A"):
    book = await author.books.afirst()


async def make_book(*args, **kwargs):
    book = Book(...)
    await book.asave(using="secondary")


async def make_book_with_tags(tags, *args, **kwargs):
    book = await Book.objects.acreate(...)
    await book.tags.aset(tags)

来源:https://docs.djangoproject.com/en/4.2/topics/async/

© www.soinside.com 2019 - 2024. All rights reserved.