django-graphql-jwt 与 django-phone-field 类型的 PhoneNumber 对象不是 JSON 可序列化的

问题描述

我目前正在使用 django-phone-field 的项目中使用 graphene-django 库。

这是我的自定义 User 模型,我在其中使用 PhoneField。

from aiohttp import web


@web.middleware
async def error_middleware(request,handler):
    try:
        response = await handler(request)
        # this is needed to handle ``return web.HTTPNotFound()`` case
        if response.status == 404:
            return web.Response(text='First custom 404 message',status=404)
        return response
    except web.HTTPException as ex:
        # this is needed to handle ``raise web.HTTPNotFound()`` case
        if ex.status == 404:
            return web.Response(text='Second custom 404 message',status=404)
        raise
    # this is needed to handle non-HTTPException
    except Exception:
        return web.Response(text='Oops,something went wrong',status=500)


app = web.Application(middlewares=[error_middleware])

我使用 django-graphql-jwt 处理身份验证。

这是我的 class User(AbstractBaseUser,PermissionsMixin): """ Custom User model to add the required phone number """ first_name = models.CharField( max_length=100 ) last_name = models.CharField( max_length=100 ) email = models.EmailField( verbose_name='Email address',max_length=255,unique=True,# Because it's unique,blank is not an option because there Could be 2 with the same value ('') blank=False,null=True ) phone = CustomPhoneField( # Please note this formatting only works for US phone numbers right Now # https://github.com/VeryApt/django-phone-field#usage # If international numbers are needed at some point,take a look at: # https://github.com/stefanfoulis/django-phonenumber-field E164_only=True,unique=True ) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) objects = UserManager() USERNAME_FIELD = 'phone' required_FIELDS = ['first_name','last_name',] 查询

tokenAuth

服务器在尝试执行该查询时检索到错误

mutation TokenAuth ($phone: String!,$password: String!) {
    tokenAuth(phone: $phone,password: $password) {
        token
        payload
        refreshExpiresIn
    }
}

我通过覆盖 PhoneField 的 { "errors": [ { "message": "Object of type PhoneNumber is not JSON serializable","locations": [ { "line": 2,"column": 5 } ],"path": [ "tokenAuth" ] } ],"data": { "tokenAuth": null } } 方法临时制作了一个猴子补丁,如下所示:

to_python

我想知道针对此问题的正确解决方案是什么,并且还想了解它的实际工作原理,以便我可以继续使用更优雅的解决方案。

解决方法

看着您的问题,我认为您正在尝试使用字符串而不是 Json 字段。如果电话号码是您可以尝试使用 JsonString 数据类型的 JSON 字段,则可以解决这个问题。