微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在石墨烯解析器函数中延迟 Django 查询集的执行?

如何解决如何在石墨烯解析器函数中延迟 Django 查询集的执行?

我使用没有中继的石墨烯/graphene-django 作为 API,用于高度嵌套的数据模型,具有跨表的外键和 m2m 关系。

我还通过切片使用偏移限制分页,因为在许多地方我返回的对象列表可能非常大。但是,我发现我的查询集在我可以切片之前执行得太早了,从而抵消了我使用分页获得的任何数据库好处。这是我的架构的一个简化示例,以帮助说明:

class BookType(ObjectType):
    id = String()
    binding = Field(BindingType)
    (... Some other attributes)
    
    def resolve_binding(parent,info):
        return parent.binding

class BookListType(ObjectType):
    total_count = Int()
    results = List(BookType,limit=Int(),offset=Int())
    
    def resolve_total_count(parent,info):
         return parent.count()
    
    def resolve_results(parent,info,offset,limit):
         return parent[offset : (limit + offset)]

class UserListType(DjangoObjectType):
    books = Field(BookListType,(varIoUs filtering arguments))
    
    class Meta:
        model = UserList

    def resolve_books(parent,**kwargs):
        return <Some Expensive and Complex Django ORM Query>

所以说我正在获取一个 UserList 及其所有书籍。我构建了我需要的查询并从 resolve_books 函数返回它,然后该函数被传递给 BookListType,后者从输入参数应用分页。然而,似乎只要我从 resolve_books 返回查询,它就会被评估并提取整个列表,这在数据库方面可能非常大且昂贵。

理想情况下,我想防止查询集被评估,直到它在 BookListType 内被切片,所以我只获取我需要的页面。我已经翻阅了源代码并尝试将 BookListType 改为连接(即使我没有使用中继),但我无法让它像我想要的那样工作。

有人对如何延迟查询集执行有任何想法吗?

也许可以将其打包到其他类型的对象中,然后再将其解包?我想尝试保留 BookListType,因为我将它重用于其他列表,它使客户端处理稍微容易一些。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。