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]

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')

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.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.