ManyToMany alanına veri nasıl eklenir?


83

Hiçbir yerde bulamıyorum, bu yüzden yardımın benim için iyi olacak :) İşte o alan:

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)

Gönderilecek form:

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

Bunun gibi bir şey denedim:

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

Veya:

categories = [1,2]

Yanıtlar:


144

Buna ayrılmış , içindekiler sayfasından iyi indekslenmiş bir Django dokümantasyon sayfası var.

Bu sayfada belirtildiği gibi, yapmanız gerekenler:

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

veya

my_obj.categories.create(name='val1')

15
my_obj.save()Güncellemeyi kaydetmek için aramanız gerekiyor mu yoksa bu otomatik olarak mı yapılıyor?
CpILL

4
@CpILL otomatik olarak yapılacak gibi görünüyor. İçinde deneyin python manage.py shell.
Rikki

1
bu belge için .save çağrısına da ihtiyacınız var: docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/…
mehdi

4
@mehdi Yalnızca çoktan çoğa alanına sahip nesneyi ilk kez oluşturduğunuzda bir birincil anahtar alması için kaydet'i çağırmanız gerekir. Bundan sonra davranış, kaydetmeden ekleyebilmenizdir.
YungGun

5

Bir başkasının, yönetici formunu Many2Many tasarruf davranışını özelleştirmek için mücadele etmesi durumunda , daha sonra değişikliklerinizin üzerine yazan m2m'nizi dolduracağından self.instance.my_m2m.add(obj), ModelForm.savegeçersiz kılmanızı arayamazsınız . Bunun yerine şu numarayı arayın:ModelForm.saveself.cleaned_data['my_m2m']

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

(Gelen QuerySet'i bir listeye dönüştürmek sorun değil - ManyToManyFieldyine de yapar.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.