#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(и любая дополнительная вещьвы хотите сделать для людей без разрешения). Я не уверен, есть ли лучший способ, но определенно справился с задачей.