【发布时间】:2021-11-04 07:14:36
【问题描述】:
当使用来自graphene_django_extras 的DjangoListObjectType 时,我可以在SearchFilter 上定义一个自定义qs 属性。
qs 函数将对象作为其唯一参数,通过它我可以获取请求,进而获取包含查询字段的查询字符串。
在拼凑我自己的解析器来获取这些字段之前,我是不是走错了路?还是有别的东西?
我们的想法是采用一种相当严格的方法,因为我们有 7 种类型的分页列表类型,其中的字段会导致一些不必要的数据库命中,因此我们想要预取一些字段。
Graphene 有一种数据加载器方法,看起来不错,但比仅在 qs 阶段预取它们更复杂。
关于数据加载器的方法,我尝试过类似的方法
class UserLoader(DataLoader):
def batch_load_fn(self, keys):
users = {user.id: user for user in User.objects.filter(id__in=keys)}
return Promise.resolve([users.get(user_id) for user_id in keys])
user_loader = UserLoader()
class BookType(DjangoObjectType):
...
author = graphene.Field(UserType)
def resolve_author(self, *args, **kwargs):
return user_loader.load(self.author.id)
哪一种明显感觉完全不对,但是他们在docs中所做的。
【问题讨论】:
-
试试这个插件,它是一个相当复杂和通用的任务,要自己实现。 github.com/tfoxy/graphene-django-optimizer
-
这与我所理解的 graphene-django-extras 不太相配。
标签: django graphene-python graphene-django