使用序列化器 Django 3.1 的异步视图

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

我正在尝试创建一个异步视图来解决 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

在我的序列化器中,我有一个自定义字段。使用其 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

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

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

django asynchronous django-rest-framework python-asyncio django-serializer
1个回答
0
投票

首先制作一个获取序列化数据的函数:

def get_serialized_data(db_results):
    serializer = MySerializer(db_results, many=True)
    return serializer.data

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

try:
    db_results = Plan.objects.all()
    return await sync_to_async(get_serialized_data)(db_results)
except Exception:
    # Handle Exception Code
© www.soinside.com 2019 - 2024. All rights reserved.