Графеновое поле возвращает 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
}
}
}
Правильно ли я ограничиваю доступ к полям или есть лучший/быстрый способ сделать это, чем писать резольверы для каждого поля, к которому я хочу ограничить доступ?