Django graphene: добавить резольвер полей с сохранением типа, унаследованного от модели
У меня есть узел, унаследованный от модели:
class OrderModel(models.Model):
FAILED = "failed"
REQUIRES_PAYMENT_METHOD = "requires_payment_method"
ORDER_STATUSES = (
(FAILED, FAILED),
(REQUIRES_PAYMENT_METHOD, REQUIRES_PAYMENT_METHOD),
)
STATUSES_MAP_FOR_NOT_ADMINS = {
REQUIRES_PAYMENT_METHOD: FAILED,
}
status = models.CharField(_('status'), choices=ORDER_STATUSES, default=NEW_ORDER, max_length=255)
class Meta(object):
db_table = 'order'
verbose_name = _('order')
verbose_name_plural = _('orders')
class OrderNode(PrimaryKeyMixin, DjangoObjectType):
status = graphene.String
def resolve_status(self, info):
if info.context.user.is_admin:
return self.status
return self.STATUSES_MAP_FOR_NOT_ADMINS.get(self.status, self.status)
class Meta:
model = OrderModel
filter_fields = GrantedOrderFilter.Meta.fields
interfaces = (relay.Node, )
Я хочу добавить пользовательский преобразователь статусов для отображения статусов, отображаемых для пользователей. Но при текущей реализации я теряю типизацию для поля статуса. Есть ли способ сохранить типизацию, созданную в модели, и добавить пользовательский резольвер?
Найдено следующее решение:
OrderStatus = graphene.Enum('OrderStatus', {
status: status for status, _ in GrantedOrder.ORDER_STATUSES
})
class OrderNode(PrimaryKeyMixin, DjangoObjectType):
status = OrderStatus
Но может быть, есть более эффективные решения?