Wie füge ich Daten zum ManyToMany-Feld hinzu?

83

Ich kann es nirgendwo finden, also wird deine Hilfe nett für mich sein :) Hier ist das Feld:

categories = models.ManyToManyField(fragmentCategory)

FragmentCategory:

class fragmentCategory(models.Model):

        CATEGORY_CHOICES = (
                        ('val1', 'value1'),
                        ('val2', 'value2'),
                        ('val3', 'value3'),
                        )

        name = models.CharField(max_length=20, choices=CATEGORY_CHOICES)

Hier ist das Formular zum Senden:

<input type="checkbox" name="val1" />
<input type="checkbox" name="val2" />
<input type="checkbox" name="val3" />

Ich habe so etwas versucht:

categories = fragmentCategory.objects.get(id=1),

Oder:

categories = [1,2]
IProblemFactory
quelle

Antworten:

141

Es gibt eine ganze Seite der Django-Dokumentation , die diesem Thema gewidmet ist und auf der Inhaltsseite gut indiziert ist.

Wie auf dieser Seite angegeben, müssen Sie Folgendes tun:

my_obj.categories.add(fragmentCategory.objects.get(id=1))

oder

my_obj.categories.create(name='val1')
Daniel Roseman
quelle
14
Müssen Sie dann anrufen my_obj.save(), um das Update zu speichern, oder erfolgt dies automatisch?
CpILL
4
@CpILL Scheint automatisch zu sein. Probieren Sie es aus python manage.py shell.
Rikki
1
Als dieses Dokument müssen Sie auch .save
mehdi
3
@mehdi Sie müssen save nur beim ersten Erstellen des Objekts mit dem Feld many to many aufrufen, damit es einen Primärschlüssel erhält. Danach können Sie das Verhalten hinzufügen, ohne es zu speichern.
YungGun
5

Falls hier jemand anderes Probleme hat, das Administratorverhalten von Many2Many anzupassen, können Sie self.instance.my_m2m.add(obj)Ihre ModelForm.saveÜberschreibung nicht aufrufen , da ModelForm.savespäter Ihr m2m ausgefüllt wird, aus self.cleaned_data['my_m2m']dem Ihre Änderungen überschrieben werden. Rufen Sie stattdessen an:

my_m2ms = list(self.cleaned_data['my_m2ms'])
my_m2ms.extend(my_custom_new_m2ms)
self.cleaned_data['my_m2ms'] = my_m2ms

(Es ist in Ordnung, das eingehende QuerySet in eine Liste zu konvertieren - das ManyToManyFieldmacht das sowieso.)

Chris
quelle