Скрыть поля в Голанг Горм

Я использую 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

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

      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
}
Другие вопросы по тегам