Как иметь 2 типа с одной и той же моделью в графене?

#python #graphene-django

#python #graphene-django

Вопрос:

Я создал проверку модели в своем проекте с CheckoutType для обработки запросов, но теперь мне нужен профиль, который в основном просто получает многие поля при проверке. Проблема в том, что проверка и профиль будут извлекаться пользователями с очень разными разрешениями, и в то время как у первого будут правильные, у второго их не должно быть. итак, я пошел с созданием 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, но как только я реализовал, все тесты, которые я сделал для проверки Тип начал давать сбой, так как кажется, что он пытается использовать ProfileType . Я немного поискал, и кажется, что relay допускает только тип для каждой модели в Django, поэтому такой подход кажется невозможным, но я не уверен, как перезаписать CheckoutType в другой схеме или как создать второй тип с разными разрешениями и разными фильтрами. Кто-нибудь знает, возможно ли это?

Комментарии:

1. В заголовке вопроса следует уточнить, что это не для ванили graphene , а специально для graphene-django пакета, который ее расширяет, и что он относится к моделям 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(), чтобы проверить, есть ли у пользователя perms, если это так, то просто верните обычный запрос, но если не просто filter(и любая дополнительная вещьвы хотите сделать для людей без разрешения). Я не уверен, есть ли лучший способ, но определенно справился с задачей.