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会自动保存关联关系
额外优化建议
- 模型语法修正:你的模型定义有几处错误,修正后更规范:
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)
- 变量命名规范:把
product_name改成product,tag改成tags,复数名更符合集合类型的语义 - 正确打印QuerySet内容:之前的
print(tag.id)会报错,正确打印所有Tag id的方式是:
for tag in tags: print(tag.id)
内容的提问来源于stack exchange,提问作者Emma William
相关产品推荐
相关产品推荐

