You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何向ManyToMany字段批量添加多条数据?

解决Django ManyToMany字段批量添加数据的问题

你的问题出在直接将QuerySet对象传给add()方法——filter()返回的是QuerySet集合,而add()默认接受单个实例/主键,直接传集合会被当作单个参数处理,所以只添加了第一条数据。

修复代码

把add(tag)改成用*解包QuerySet,让add()一次性接收所有Tag实例:

def home(request, pk):
    product = Product.objects.get(pk=pk)
    tags = Tags.objects.filter(product_of_names=product)
    insert_data = Group.objects.create()
    # 用*解包QuerySet,批量添加所有关联的Tag
    insert_data.tag_group.add(*tags)
    # 注意:调用add()后无需再调用save(),Django会自动保存关联关系

额外优化建议

  1. 模型语法修正:你的模型定义有几处错误,修正后更规范:
class Product(models.Model):
    name = models.CharField(max_length=100)  # 去掉多余的models.,添加必填的max_length参数

class Tags(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)  # 字段名简化,添加必填的on_delete参数
    tag_name = models.CharField(max_length=50)  # 添加必填的max_length参数

class Group(models.Model):
    tag_group = models.ManyToManyField(Tags)
  1. 变量命名规范:把product_name改成product,tag改成tags,复数名更符合集合类型的语义
  2. 正确打印QuerySet内容:之前的print(tag.id)会报错,正确打印所有Tag id的方式是:
for tag in tags:
    print(tag.id)

内容的提问来源于stack exchange,提问作者Emma William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:18:27