【问题标题】:How to have 2 Types with the same model in Graphene?如何在石墨烯中拥有 2 种具有相同型号的类型?
【发布时间】:2021-02-17 00:52:10
【问题描述】:

我在我的项目上创建了一个模型 Checkout,使用 CheckoutType 来处理请求,但现在我需要一个 Profile,它基本上只是在 Checkout 上获取许多字段。问题是 Checkout 和 Profile 将由具有非常不同权限的用户检索,而第一个将拥有正确的权限,而第二个则不能拥有它们。所以我创建了 2 种类型:

结帐:

class CheckoutType(ModelType):
    class Meta:
        model = Checkout
        interfaces = [graphene.relay.Node]
        connection_class = CountableConnection
        permissions = ['app.view_checkout']
        filter_fields = {        
            'zone': ['exact'],
            'vehicle__mark': ['exact'],
            'status': ['exact']
        }

简介:

class ProfileFilter(django_filters.FilterSet):

    class Meta:
        model = Checkout
        fields = ['zone','status']

    @property
    def qs(self):
        # The query context can be found in self.request.
        return super(ProfileFilter, self).qs.filter(salesman=self.request.user)

class ProfileType(ModelType):
    class Meta:
        model = Checkout
        interfaces = [graphene.relay.Node]
        connection_class = CountableConnection
        filterset_class = ProfileFilter

这里的问题是,第一个不应该过滤,只是一个常规模式,而第二个应该由发出请求的用户过滤,这和权限是我使用 2 的原因,但是一旦我实施,我为 Checkout Type 所做的所有测试都开始失败,因为它似乎试图使用 ProfileType。我搜索了一下,似乎中继只允许 Django 中每个模型的类型,所以这种方法似乎不可能,但我不确定如何在另一个模式上覆盖 CheckoutType,或者如何制作第二个类型具有不同的权限和不同的过滤器。有人知道这是否可能吗?

【问题讨论】:

  • 问题标题应该澄清这不是针对 vanilla graphene,而是专门针对扩展它的 graphene-django 包并且它与 django 模型相关。

标签: python graphene-django


【解决方案1】:

以防万一有人在同一条船上,我想我找到了一种让它工作的方法,但是用不同的方法,我只是稍微修改了 CheckoutType:

class CheckoutType(ModelType):
    # Meta

    @classmethod
    def get_queryset(cls, queryset, info):
        if info.context.user.has_perm('app.view_checkout'):
            return queryset
        return queryset.filter(salesman=info.context.user)

基本上在这里我从 Meta 中删除了权限,因为我不想在那里检查,然后我覆盖 get_queryset() 来检查用户是否有权限,如果是这样,那么就返回正常查询,但如果不只是过滤(以及您想在未经许可的情况下为人们做的任何其他事情)。我不确定是否有更好的方法,但肯定做到了。

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2018-01-29
    • 2019-08-08
    • 2022-01-17
    • 1970-01-01
    • 2017-11-02
    • 2020-11-18
    • 2019-12-20
    • 2020-06-21
    相关资源
    最近更新 更多