查看Sequelize文档,我找到了如何指定要更新的字段,但我想指定不要更新的字段。
类似的东西:
Model.update(,{excludeFields:['id']})
有没有办法做到这一点?
答案 0 :(得分:2)
当我遇到这个问题时,我在sequelize docs中找不到解决这个问题的方法,但我解决了这个问题:
Model.findOne()
.then(instance => {
const fields = instance.attributes.filter(attribute => {
return !['foo'].includes(attribute);
});
return instance.update(data, { fields });
});
答案 1 :(得分:2)
TL; DR 获取所有字段,然后排除不需要的字段。
const fieldsToExclude = ['password', 'sensitive_info', 'attribute_not_allowed_due_to_user_role']
const myFields = Object.keys(MyModel.rawAttributes).filter( s => !fildsToExclude.includes(s))
MyModel.update(newValue, {fields: myFields})
如果您正在(应该)问我从哪里得到的,它不在文档中! 继续阅读。
一些详细信息
虽然我很喜欢Sequelize,但我承认他们的参考文献有时缺少一些信息。
例如findByPk
内部调用findOne
,内部调用findAll
的事实,这意味着传递给options
的{{1}}对象也适用于findAll
和{ {1}}
不幸的是,findOne
方法无法处理与findByPk
函数系列相同的update
对象。
以下是options
处理find*
对象的update
属性的方式
fields
另一方面,options
函数最终将通过// Remove values that are not in the options.fields
if (options.fields && options.fields instanceof Array) {
for (const key of Object.keys(values)) {
if (options.fields.indexOf(key) < 0) {
delete values[key];
}
}
} else {
const updatedAtAttr = this._timestampAttributes.updatedAt;
options.fields = _.intersection(Object.keys(values), Object.keys(this.tableAttributes));
if (updatedAtAttr && options.fields.indexOf(updatedAtAttr) === -1) {
options.fields.push(updatedAtAttr);
}
}
调用find*
,实现如下:
_.confirmOptions()
这就是发生“排除”魔术的地方。
HTH
答案 2 :(得分:0)
如果您要排除的属性数量很少,例如2或1,并且如果您只想不允许更新某个属性,则最简单的解决方案是从更改对象中删除对象属性。
if (model) {
delete model.password;
delete model.sensitive_info;
}
答案 3 :(得分:-1)
也许这也适用于更新?
Model.findAll({
attributes: { exclude: ['baz'] }
});