Графеновое поле возвращает null в ответе, даже если возникло исключение

Я использую Django + GraphQL для создания бэкенда для моего проекта. У меня есть модель User, определенная в моем models.py, которая имеет множество полей, включая, например, email и telephone, определенные в следующем фрагменте кода:

email = models.EmailField(_("email address"), max_length=320, unique=True)
telephone = models.CharField(max_length=20, null=True, default=None, blank=True)

Определение для UserType это:

import graphene
from graphene_django import DjangoObjectType

from main.graphql import validators
from main.models import User


class UserType(DjangoObjectType):
    class Meta:
        model = User
        fields = (
            "id",
            "first_name",
            "last_name",
            "email",
            "birthdate",
            "birthplace",
        )
    def resolve_telephone(self, info):
        validators.verify_request_from_staff_user_or_from_superuser_if_target_staff(
            info, self, info.context.user, "telephone"
        )
        return self.telephone
    def resolve_verified_email(self, info):
        validators.verify_request_from_staff_user_or_from_superuser_if_target_staff(
            info, self, info.context.user, "verified_email"
        )
        return self.verified_email

verify_request_from_staff_user_or_from_superuser_if_target_staff - простая функция, которая вызывает исключение типа graphql.GraphQLError, если пользователь запроса пытается получить доступ к информации, которую он не может получить (т.е. Staff-user получает доступ к другим пользователям персонала, base-user получает доступ к другим пользователям).

Я определил запрос testUser, который принимает id в качестве аргумента и возвращает пользователя с таким id. Если я запрашиваю в запросе поле email, то результат не содержит поля email (и это мое желаемое поведение), но если я запрашиваю поле telephone, то результат содержит поле telephone с нулевым значением.

Я знаю, что это связано с null=True в определении телефонного поля, но я хочу не редактировать поле db.

Как я могу добиться желаемого поведения (а именно отсутствия такого поля в ответе) для поля telephone?

Примеры:

query testEmail {
  testUser(id: 9) {
    email
  }
}
query testTelephone {
  testUser(id: 9) {
    telephone
  }
}

ТестEmail возвращает

{
  "errors": [
    {
      "message": "Cannot access field 'email'",
      "locations": [
        {
          "line": 3,
          "column": 5
        }
      ],
      "path": [
        "testUser",
        "email"
      ]
    }
  ],
  "data": {
    "testUser": null
  }
}

ТестТелефон возвращается

{
  "errors": [
    {
      "message": "Cannot access field 'telephone'",
      "locations": [
        {
          "line": 8,
          "column": 5
        }
      ],
      "path": [
        "testUser",
        "telephone"
      ]
    }
  ],
  "data": {
    "testUser": {
      "telephone": null
    }
  }
}

Правильно ли я ограничиваю доступ к полям или есть лучший/быстрый способ сделать это, чем писать резольверы для каждого поля, к которому я хочу ограничить доступ?

Вернуться на верх