web-dev-qa-db-fra.com

Comment ajouter plusieurs objets à la relation ManyToMany à la fois dans Django?

Basé sur le Django doc, je devrais être capable de transmettre plusieurs objets à la fois pour les ajouter à une relation multiple mais je reçois

* TypeError: type inshashable: 'list'

lorsque j'essaie de transmettre un ensemble de requêtes Django dans une liste. Le passage d'un ensemble de requêtes ou d'un ValuesListQueryset semble également échouer. Existe-t-il un meilleur moyen que d'utiliser une boucle for?

156
philgo20

Utilisez: object.m2mfield.add(*items) comme décrit dans la documentation :

add() accepte un nombre arbitraire d'arguments, pas une liste d'entre eux.

add(obj1, obj2, obj3, ...)

Pour développer cette liste en arguments, utilisez *

add(*[obj1, obj2, obj3])

Addenda:

Django n'appelle pas obj.save() pour chaque élément, mais utilise plutôt bulk_create().

274
Yuji 'Tomita' Tomita

Pour ajouter dessus, si vous voulez les ajouter à partir d'un queryset

Exemple

# Returns a queryset
permissions = Permission.objects.all()

# Turns it into a list
permissions = list(permissions)

# Add the results to the many to many field (notice the *)

group = MyGroup.objects.get(name='test')

group.permissions.add(*permissions)

De: Insérer les résultats de la requête dans ManytoManyfield

37
Dr Manhattan

Django 1.9 ajoute des moyens supplémentaires d’ajouter à une relation plusieurs à plusieurs.

Documentation: https://docs.djangoproject.com/fr/1.9/ref/models/relations/#Django.db.models.fields.related.RelatedManager.set

set est une nouvelle gentillesse:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)
26
aero