Làm cách nào để thêm dữ liệu vào trường ManyToMany?


83

Tôi không thể tìm thấy nó ở bất cứ đâu, vì vậy sự giúp đỡ của bạn sẽ rất tốt cho tôi :) Đây là lĩnh vực đó:

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)

Đây là biểu mẫu để gửi:

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

Tôi đã thử một cái gì đó như thế này:

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

Hoặc là:

categories = [1,2]

Câu trả lời:


141

Có cả một trang của tài liệu Django dành cho điều này , được lập chỉ mục tốt từ trang nội dung.

Như trang đó nêu, bạn cần làm:

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

hoặc là

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

14
Sau đó, bạn có cần gọi my_obj.save()để lưu bản cập nhật hay việc này được thực hiện tự động?
CpILL

4
@CpILL Có vẻ được thực hiện tự động. Hãy thử nó trong python manage.py shell.
Rikki

1
như doc này bạn cần gọi lệnh .save quá: docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/...
mehdi

3
@mehdi Bạn chỉ cần gọi lưu lần đầu tiên mà bạn tạo đối tượng với trường nhiều đến nhiều để nó nhận khóa chính. Sau đó, hành vi là bạn có thể thêm mà không cần lưu.
YungGun

4

Trong trường hợp ai đó ở đây gặp khó khăn trong việc tùy chỉnh biểu mẫu quản trị Many2Many lưu hành vi, bạn không thể gọi ghi đè self.instance.my_m2m.add(obj)của mình ModelForm.save, vì ModelForm.savesau đó sẽ điền m2m của bạn từ self.cleaned_data['my_m2m']đó ghi đè các thay đổi của bạn. Thay vào đó hãy gọi:

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

(Bạn có thể chuyển QuerySet đến thành một danh sách - ManyToManyFieldđiều đó vẫn tốt.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.