Django模型的石墨烯Django突变更容易

django-model-mutations的Python项目详细描述


Django模型突变

这个包添加了变异类,使用django Rest框架序列化器可以更容易地使用django模型创建graphene突变。它以类似于Django Rest框架视图或原始Django视图的方式扩展graphene变异类。在

它还提供了添加权限检查或确保登录用户的简单方法,以及重写或添加类似于django窗体或rest框架视图的功能的简单方法,例如get_queryset()或{}函数。在

还有来自rest框架的高级错误报告,它返回无效字段和错误消息。在

灵感来自Saleorgraphene-django-extras和{a3}

安装

pip install django-model-mutations

基本用法

此包提供的主要类:

mutationsmixins
CreateModelMutationLoginRequiredMutationMixin
CreateBulkModelMutation
UpdateModelMutation
UpdateBulkModelMutation
DeleteModelMutation
DeleteBulkModelMutation
Django用法

字段是由序列化程序生成的
返回类型由模型从全局graphene注册表中检索,您只需像示例中那样导入它

^{pr2}$

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_objectget_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_kwargsget_serializervalidate_instance等函数(例如,在这里,您可以覆盖默认的ValidationError异常,如果您不希望出现不存在的id查找的异常,则返回None)

贡献

欢迎拉取请求。对于重大变化,请先打开一个问题,讨论您希望更改的内容。在

请确保根据需要更新测试。在

许可证

MIT

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用Jackson解析非同构JSON对象数组   java为什么'Stream<T>::<A>toArray(IntFunction<A[]>)`接受没有绑定的类型参数A?   java在JavaFX2.0中获取给定布局中的节点大小?   java双链接列表创建节点   java使用HashMap添加、删除和查找   java中push_back(C++)的等效方法是什么?   java在Jetty中运行servlet时获得HTTP 500   用java显示包含图像和文本的页面的最简单文档格式   swing从选项卡窗格Java中的不同选项卡访问数据   字符串Java帮助检查登录类使用。CSV文件   java Struts 1.2.9动作链接   包含max元素的java列表   currentNode上的jcr Java空检查   在Android中使用OpenNLP的POSTaggerMe时出现java NullPointerException   java Logback只将消息记录到syslog一次   如何用Java编写构造函数的API文档   java从gallery中获取所有图像并存储在阵列中   java Maven:将外部jar文件夹添加到类路径