Django模型的石墨烯Django突变更容易
django-model-mutations的Python项目详细描述
Django模型突变
这个包添加了变异类,使用django Rest框架序列化器可以更容易地使用django模型创建graphene突变。它以类似于Django Rest框架视图或原始Django视图的方式扩展graphene变异类。在
它还提供了添加权限检查或确保登录用户的简单方法,以及重写或添加类似于django窗体或rest框架视图的功能的简单方法,例如get_queryset()
或{
还有来自rest框架的高级错误报告,它返回无效字段和错误消息。在
灵感来自Saleor、graphene-django-extras和{a3}
安装
pip install django-model-mutations
基本用法
此包提供的主要类:
mutations | mixins |
---|---|
CreateModelMutation | LoginRequiredMutationMixin |
CreateBulkModelMutation | |
UpdateModelMutation | |
UpdateBulkModelMutation | |
DeleteModelMutation | |
DeleteBulkModelMutation |
字段是由序列化程序生成的
返回类型由模型从全局graphene注册表中检索,您只需像示例中那样导入它
GraphQl用法
生成的GraphQl模式可以用Meta
字段修改,如上面UserCreateMutation
中所述。在
默认情况下,所有突变都具有errors
字段,其中包含来自rest框架序列化程序的验证错误或查找错误。目前,权限被拒绝和其他异常不会使用此错误报告,而是默认错误报告,有关用法,请参阅测试。在
# default argument name is input # default return field name is model name mutation userCreate (input: {username: "myUsername"}) { user { id username } errors { field messages } } # Bulk operations return 'count' and errors mutation userCreate (input: {username: "myUsername"}) { count errors { field messages } } # update mutations # update and delete mutations by default specify lookup field 'id' or 'ids' for bulk mutations mutation { userUpdate (id: 2, input: {username:"newUsername"} ) { user { id username } errors { field messages } } } mutation { userBulkUpdate (ids: [2, 3], isActive: false ) { count errors { field messages } } } # delete mutations mutation { userDelete (id: 1) { user { id } errors { field messages } } } mutation { userBulkDelete (ids: [1, 2, 3]) { count errors { field messages } } }
添加功能
所有类都派生自graphene.Mutation
。当您想重写一些主要功能时,最好的位置可能是perform_mutate
,它是在graphene mutate
进行权限检查后调用的。在
一般来说,您要重写的主要函数可能是:save()
和{get_queryset()
对于批量突变。get_object
或get_queryset
您应该重写以添加更多用于获取对象的筛选器。save
对数据库执行最后的保存/更新/删除操作,您可以在其中添加其他字段。在
示例:
# lets only update users that are inactive and add some random fieldclassUserUpdateInactiveMutation(mutations.UpdateModelMutation):classMeta:model=User@classmethoddefget_object(cls,object_id,info,**input):# can get the object first and then checkobj=super(UserUpdateInactiveMutation,cls).get_object(object_id,info,**input)ifobj.is_active:returnNonereturnobj@classmethoddefsave(cls,serializer,root,info,**input):saved_object=serializer.save(updated_by=info.context.user)returncls.return_success(saved_object)# same but for bulk mutation we have to override get_querysetclassUserBulkUpdateInactiveMutation(mutations.UpdateBulkModelMutation):classMeta:model=User@classmethoddefget_queryset(cls,object_ids,info,**input):qs=super(UserBulkUpdateInactiveMutation,cls).get_queryset(object_ids,info,**input)qs.filter(is_active=False)returnqs
对于整个功能流程,请检查django_model_mutations\mutations.py
中的基本模型。
它的灵感来自rest框架,因此您可以找到get_serializer_kwargs
、get_serializer
、validate_instance
等函数(例如,在这里,您可以覆盖默认的ValidationError
异常,如果您不希望出现不存在的id查找的异常,则返回None)
贡献
欢迎拉取请求。对于重大变化,请先打开一个问题,讨论您希望更改的内容。在
请确保根据需要更新测试。在
许可证
- 项目
标签: