Django manytomany添加或删除

时间:2012-02-19 15:30:14

标签: django django-models django-orm

将pk整数列表传递给添加或删除时 - 是否访问了对象?即。每个pk都有数据库调用吗?

2 个答案:

答案 0 :(得分:2)

当您创建ManyToManyField而未指定中间表(使用through)时,Django会为您生成一个表。这个表只需要两个模型的pks,所以不需要从其他对象中选择任何东西来保存新的关系。

将为每个插件创建一个新行,可能使用许多插入,但不一定需要很多数据库调用(例如,可以使用多个插入命令的单个SQL查询)。这些创建所需的所有信息(对象的pks)都是随时可用的,因此不需要任何超出必要的数据库命中。

更新:似乎我错了。查看源代码(django / db / models / fields / related.py),我看到它为每个对象执行独立创建:

for obj_id in new_ids:
    self.through._default_manager.using(db).create(**{
        '%s_id' % source_field_name: self._pk_val,
        '%s_id' % target_field_name: obj_id,
    })

在此之前,它还会检查数据库中是否已存在任何提供的pks(以避免重复的条目/唯一性约束违规):

vals = self.through._default_manager.using(db).values_list(target_field_name, flat=True)
vals = vals.filter(**{
    source_field_name: self._pk_val,
    '%s__in' % target_field_name: new_ids,
})
new_ids = new_ids - set(vals)

通过单个查询完成此检查...

答案 1 :(得分:0)

您是否尝试使用QuerySet.query属性自行检查?