【问题标题】:How to add data into ManyToMany field?如何将数据添加到 ManyToMany 字段?
【发布时间】:2009-07-25 16:02:59
【问题描述】:

我在任何地方都找不到它,所以你的帮助对我来说会很好:) 这是那个字段:

categories = models.ManyToManyField(fragmentCategory)

片段类别:

class fragmentCategory(models.Model):

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

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

这是要发送的表格:

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

我试过这样的:

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

或者:

categories = [1,2]

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    有一整页的 Django 文档devoted to this,从内容页面很好地索引。

    正如该页面所述,您需要执行以下操作:

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

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

    【讨论】:

    • 您需要致电my_obj.save() 来保存更新还是自动完成?
    • @CpILL 似乎是自动完成的。在python manage.py shell 中试用。
    • 作为此文档,您也需要调用 .save :docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/…
    • @mehdi 您只需要在第一次创建具有多对多字段的对象时调用 save 以便它获取主键。之后的行为是您可以添加而不保存。
    【解决方案2】:

    如果其他人最终在这里努力自定义管理表单 Many2Many 保存行为,您不能在 ModelForm.save 覆盖中调用 self.instance.my_m2m.add(obj),因为 ModelForm.save 稍后会从 self.cleaned_data['my_m2m'] 填充您的 m2m,这会覆盖您的更改.而是调用:

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

    (可以将传入的 QuerySet 转换为列表 - ManyToManyField 无论如何都会这样做。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多