Скрыть поля в Голанг Горм
Я использую Gorm в своем проекте Golang. Именно у меня есть Rest-API, и я получаю запрос, создаю процесс и возвращаю объект, поэтому, например, у меня есть структура User, подобная этой:
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, но мне кажется, что для простоты требуется много работы, и я хочу знать, есть ли другой способ. большое спасибо
5 ответов
Как сказал Гэвин, я бы предложил иметь две отдельные модели и дать модели возможность конвертировать в правильный тип возврата.
модели /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. Для элементов в 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:"-"
в горм.Модель
Например:
type User struct {
gorm.Model `json:"-"`
Password []byte
Active bool
Email string
ActivationToken string
RememberPasswordToken string
}
Я нашел способ скрыть отношение к моей модели User от моей модели Sessions, создав унаследованную структуру сomitempty
// 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
type OrmModel struct {
gorm.Model `json:"-"`
ID uint `gorm:"primarykey" json:"id,omitempty"`
}
type User struct {
OrmModel
Password []byte
Active bool
Email string
ActivationToken string
RememberPasswordToken string
}