2017-05-19 10 views
2

Ich möchte Graphen verwenden, um viele Leute auf einmal zu erstellen. Das Dokument nur die Art und Weise erwähnt eine Person wie diese zu erstellen:Mutationen - Batch-Erstellung von Objekten

class CreatePerson(graphene.Mutation): 
class Input: 
    name = graphene.String() 
    age = graphene.Int() 

ok = graphene.Boolean() 
person = graphene.Field(lambda: Person) 

@staticmethod 
def mutate(root, args, context, info): 
    person = Person(name=args.get('name'), age=args.get('age'), mobile=args.get('mobile')) 
    ok = True 
    return CreatePerson(person=person, ok=ok) 

gibt es irgendwelche Möglichkeiten, um es getan?

+0

FYI Sie können Ihre Lösung als Antwort posten und akzeptieren, damit die Leute, die nach Ihnen kommen, die endgültige Lösung sehen können. –

Antwort

0

I Jan Hančič

Es gibt eine Lösung Basis auf der Antwort von herausfinden können, Typ graphene.InputObjectType zu verwenden in diesem Fall

Die Lösung kann

sein
class PersonInput(InputObjectType): 
    name = graphene.String() 
    age = graphene.Int() 

class CreatePeople(graphene.Mutation): 
    class Input: 
     people = graphene.List(PersonInput) 

    people = graphene.List(lambda: Person) 

    @staticmethod 
    def mutate(root, args, context, info): 
     people = [Person.objects.create(name=person.name, age=person.age) for person in args.get('people')] 
     return CreatePeople(people=people) 
2

Machen Sie Ihre Mutationseingabe zu einer Liste und geben Sie eine Liste der erstellten Personen zurück. Etwas wie folgt aus:

class CreatePerson(graphene.Mutation): 
    class Input: 
     name = graphene.List(graphene.String) 

    ok = graphene.Boolean() 
    people = graphene.List(Person) 

    @staticmethod 
    def mutate(root, args, context, info): 
     people = [Person(name=name) for name in args.get('name)] 
     ok = True 
     return CreatePerson(people=people, ok=ok) 
+0

großartig! aber wie kann ich mit mehr als einem Feld umgehen? Z.B. Name, Adresse und Alter der Person? –

+1

Sie können komplexe Eingabetypen haben, siehe die Dokumentation: http://docs.graphen-python.org/en/latest/types/mutations/ –

+0

Hallo Jan, ich benutze das InputObject und es hat funktioniert, aber die Daten wurden nicht gespeichert die db. Würde es Ihnen etwas ausmachen, dabei zu helfen? Vielen Dank! –

1

Statt eine Mutation zu verwenden, die eine Liste von Objekten erstellt, können Sie auch eine Mutation aufrufen, die ein Objekte mehrmals in einer GraphQL Anfrage schafft. Dies wird erreicht, GraphQL Aliases mit:

mutation { 
    c001: createPerson(
    name: "Donald Duck" 
    age: 42 
) { 
    id 
    } 

    c002: createPerson(
    name: "Daisy Duck" 
    age: 43 
) { 
    id 
    } 

    c003: createPerson(
    name: "Mickey Mouse" 
    age: 44 
) { 
    id 
    } 
} 

in this FAQ mehr lesen.

+0

der Link zu den FAQ ist tot. – lbrahim

0

Sie erhalten eine Liste der Eingabe, alle Instanzen erstellen und bringt sie alle

Der Modellknoten/Typ sollte

class UserType(DjangoObjectType): 

    class Meta: 
     model = User 
     interfaces = (CustomGrapheneNode,) 
     filter_fields = {} 
     only_fields = (
      'name', 
      'email' 
     ) 

definieren Eingabefelder

class UserInput(graphene.InputObjectType): 
    name = graphene.String(required=True) 
    password = graphene.String(required=True) 

Mutation Klasse

wie- sein
class CreateUser(graphene.Mutation): 
    users = graphene.List(UserType) 

    class Input: 
     data = graphene.List(UserInput) 

    Output = UserType 

    def mutate(self, info, data): 
     users = [] 
     for item in data: 
      user = User.objects.create(name=data['name'], 
             password=data['password']) 
      users.append(user) 
     return CreateUser(users=users) 

machen diese Mutation aufrufbar durch Hauptschema

class Mutation(): 
    create_user = CreateUser.Field() 

die Mutation Query-Ansicht als sein -

mutation{ 
    createUser(data:[{name:"john", password:"1234"}, 
        {name:"john", password:"1234"}]) { 
     user{ 
      name 
     } 
    }  
} 
Verwandte Themen