带有序列化器的异步视图 Django 3.1

Shi*_*rux 5 django asynchronous django-serializer django-rest-framework python-asyncio

我正在尝试创建一个异步视图来解决 Django 3.1 的端点问题。

我有我的 AsyncView,在这个视图中我有下面的代码行:

try:
    db_result= await sync_to_async(list)(Plan.objects.filter())
    serializer =  MySerializer(db_results, many=True)
    return serializer.data
except Exception:
    # Handle Exception Code
Run Code Online (Sandbox Code Playgroud)

在我的序列化器中,我有一个自定义字段。使用其 obj 属性对数据库进行其他查询来检索其数据。这是我遇到一些问题的地方,因为这是一个异步上下文。

序列化器代码:

MySerializer(serializers.ModelSerializer):

    custom_field = serializers.SerializerMethodField(required=False)

    def get_custom_field(self, obj):
        try:
            # This is failing, is not retrieving data from DB since it's async context
            related_stuff = obj.related_stuff.filter(filter_condition=filter_condition)
            # More code after this
            .
            .
            .
            .
            return custom_field_object
        except Exception:
            return None

Run Code Online (Sandbox Code Playgroud)

我尝试在视图代码中的序列化器之前放置一个等待,并将 async 属性添加到 get_custom_field 方法(使用数据库查询中的sync_to_async 运算符)。什么也没得到。

有人知道如何解决这个具体问题吗?

Mas*_*ari 0

首先创建一个获取序列化数据的函数:

def get_serialized_data(db_results):
    serializer = MySerializer(db_results, many=True)
    return serializer.data
Run Code Online (Sandbox Code Playgroud)

现在更改您的异步视图,如下所示:

try:
    db_results = Plan.objects.all()
    return await sync_to_async(get_serialized_data)(db_results)
except Exception:
    # Handle Exception Code
Run Code Online (Sandbox Code Playgroud)