您如何按范围排除和包含 Sequelize 中的字段?

How do you exclude and include fields in Sequelize by scope?

const getMe = await UserModel.scope("test").findOne({
  where: {
    uid: uid,
  },
  include: [
    {
      model: GroupModel,
      as: "groups",
      include: ["product"],
    },
  ],
});

我正在尝试根据范围管理排除字段和允许字段。

defaultScope: {
  attributes: {
    exclude: ["id"],
  },
},
scopes: {
  test: {
    atrributes: {
      exclude: ["email"],
    },
  },
},

协会

UserModel.hasMany(GroupModel, { as: "groups" });

Groupmodel.belongsTo(UserModel, {
  foreignKey: "userId",
  as: "user",
});
GroupModel.belongsTo(ProductModel, {
  foreignKey: "productId",
  as: "product",
});

作为测试,我默认排除“id”,并且在测试范围内我排除“email”。我已经尝试了从 exclude include 直接在 findOne 调用中设置 attributes 的所有方法。没有任何效果。

排除“Public”returns 的某些字段并包括某种“管理范围”的所有字段的正确方法是什么?

如果你有defaultScope这样的。

defaultScope: {
    attributes: {
        exclude: ['email']
    }
}

当您查找查询时,它默认排除“电子邮件”并使用 unscoped 禁用 defaultScope

// This should not return email
UserModel.findOne()

// Admin case: unscoped to disable defaultScope. This should return email.
UserModel.unscoped().findOne()

或者,如果您想要更明确,您可以将作用域命名为“admin”。

{
    defaultScope: {
        attributes: {
            exclude: ['email']
        }
    },
    scopes: {
        admin: {}  // No special options for admin scope. No exclusion. 
    }
}

通过这种方式查找查询时,默认情况下会排除“电子邮件”。然后,如果您使用“admin”范围,它不会排除任何内容。

// This should not return email
UserModel.findOne()

// Admin case: This should overwrite the defaultScope.
UserModel.scope('admin').findOne()

.scope(str) 函数会覆盖 defaultScope,因此当您使用 .scope(str).

时,defaultScope 中的任何选项都会被忽略