有没有办法优雅地使用 django 模型作为输入对象类型?

use*_*962 5 graphene-django

说我有,

class PersonNode(DjangoObjectType):
    class Meta:
        model = Person
        fields = ('first_name', 'last_name', 'age',
                  'sex', 'alive', 'unique_identifier',)
        filter_fields = ('first_name', 'last_name', 'age',
                         'sex', 'alive', 'unique_identifier',)
        interfaces = (graphene.relay.Node,)

class PersonNodeInput(graphene.InputObjectType):
    first_name = graphene.String()
    last_name = graphene.String()
    # rest of person model fields

class Valid(graphene.ObjectType):
    ok = graphene.Boolean()

class Query(graphene.ObjectType):
    validate_person = graphene.Field(Valid, args={
                                     "data": PersonNodeInput()})
    person = graphene.relay.Node.Field(PersonNode)
    all_people = DjangoFilterConnectionField(PersonNode)

    def resolve_validate_person(root, info, data):
        print("resolve validate person")
        return Valid(ok=True)
Run Code Online (Sandbox Code Playgroud)

是否可以避免写出PersonNodeInput?如果您可以对“DjangoInputObjectType”之类的内容进行子类化并在 Meta 属性中指定所需的模型和字段,那就太好了。

bjm*_*jmc 2

我们一直在使用这个Graphene Django CUD库,它试图删除一些涉及定义突变的样板文件。

将您的案例适应他们的示例看起来像

from graphene_django_cud.mutations import DjangoCreateMutation

class CreatePersonMutation(DjangoCreateMutation):
    class Meta:
        model = Person

class PersonMutations(graphene.ObjectType):
    create_person = CreateUserMutation.Field()

schema = Schema(mutation=PersonMutations)
Run Code Online (Sandbox Code Playgroud)

我不知道它与中继节点的配合效果如何,因为我们没有使用中继。