如何更新Sequelize Model不包括字段

时间:2017-06-03 01:40:01

标签: sequelize.js

查看Sequelize文档,我找到了如何指定要更新的字段,但我想指定要更新的字段。

类似的东西:
Model.update(,{excludeFields:['id']})

有没有办法做到这一点?

4 个答案:

答案 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'] }
});