繁体   English   中英

在 Golang Gorm 中隐藏字段

[英]Hide fields in Golang Gorm

我在我的 Golang 项目中使用 Gorm。 确切地说,我有一个 Rest-API,我收到一个请求进行处理并返回一个 object,所以,例如,我有一个这样的结构用户:

type User struct {
    gorm.Model
    Password []byte
    Active bool
    Email string
    ActivationToken string
    RememberPasswordToken string
}

现在,当我创建一个用户时,我将其编码为 JSON:

json.NewEncoder(w).Encode(user)

但是在客户端,我收到了一些我不想发送/接收的字段,例如:Created_At、Deleted_At、Updated_At、Password。 那么,在响应中忽略或隐藏该字段的最佳方法是什么? 我看到我可以使用一个名为 Reflect 的库,但对于一个简单的事情来说似乎需要做很多工作,我想知道是否还有其他方法。 非常感谢你

正如Gavin所说,我建议使用两个独立的模型,并使模型能够转换为正确的返回类型。

车型/ user.go

package models

type User struct {
    gorm.Model
    Password []byte
    Active bool
    Email string
    ActivationToken string
    RememberPasswordToken string
}

func (u *User) UserToUser() app.User {
    return app.User{
        Email: u.Email
    }
}

应用程序/ user.go

package app

type User struct {
    Email string
}

如果你想要一个固定的对象返回,你可以用json:"-"更改标签json:"-"来决定用json发送的元素。 对于gorm.Model中的元素:

type Model struct {
    ID        uint `gorm:"primary_key"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time `sql:"index"`
}

您可以将它们替换为您自己的结构:

type OwnModel struct {
    ID        uint       `gorm:"primary_key"`
    CreatedAt time.Time  `json:"-"`
    UpdatedAt time.Time  `json:"-"`
    DeletedAt *time.Time `json:"-";sql:"index"`
}

所以,你的User结构就是这样的:

type User struct {
    OwnModel
    Password []byte
    Active bool
    Email string
    ActivationToken string
    RememberPasswordToken string
}

The other User fields is your decision to add or not `json:"-"` tag.

对我来说帮助添加json:"-"到gorm.Model

例如:

type User struct {
    gorm.Model `json:"-"`
    Password []byte
    Active bool
    Email string
    ActivationToken string
    RememberPasswordToken string
}

我找到了一种方法,通过创建一个带有omitempty的继承结构,从我的会话 model 中隐藏与我的用户 model 的关系

// Trick to hide the User assocation from the results
type Session struct {
    models.Session
    User *models.User `json:"User,omitempty"`
}

func Token(c *fiber.Ctx) error {
    user := auth.User(c)
    var sessions []Session
    database.Db.Find(&sessions, "user_id = ?", user.ID)
    return render.Render(c, sessions)
}

我希望这会有所帮助——我还添加了一个功能请求——我认为这将是 gorm 的内置功能

https://github.com/go-gorm/gorm/issues/5746

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM