【问题标题】:How to unpack user payload with gorm?如何用gorm解压用户payload?
【发布时间】:2022-11-02 00:02:15
【问题描述】:

我是 golang 新手,来自 Python。我想知道是否有办法在验证数据后解压缩数据。具体来说,我想在这里从结构转换为 Gorm 模型。

在 python 中,我习惯于做这样的事情:

user_payload = {'id': 123, 'name': 'alex', 'preferences': ['one', 'two']}
new_user = UserORM(**user_payload)
session.commit(new_user)

**user_payload 位相当于我写这个:

new_user = UserORM(id=123, name='alex', preferences=['one', 'two'])

这是我正在处理的 golang 项目,并试图弄清楚如何在以下位置实现它:

// Media controller

func CategorizeMedia(context *gin.Context) {
    payload, err := ValidateRequest[CategorizeMediaRequest](context)
    if err != nil {
        context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    media := models.Media{Category: &payload.Category,
        Date:        payload.DescriptiveFields.Date,
        Description: payload.DescriptiveFields.Description,
        People:      payload.DescriptiveFields.People,
        Tags:        payload.DescriptiveFields.Tags,
    }

    if err := database.Connection.Create(&media).Error; err != nil {
        context.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }
    context.JSON(http.StatusOK, gin.H{"done": true})
}
// Request models

package controllers

import (
    "github.com/gin-gonic/gin"
    "time"
)

type DescriptiveFields struct {
    Date        *time.Time `json:"date"`
    Description *string    `json:"description"`
    People      *[]string  `json:"people"`
    Tags        *[]string  `json:"tags"`
}

type CategorizeMediaRequest struct {
    Category          string            `json:"category" binding:"required"`
    DescriptiveFields DescriptiveFields `json:"descriptors"`
}

// Removed the other models mentioned here for simplicity's sake

func ValidateRequest[T CreateUserRequest | DeleteUserRequest | LoginRequest | CategorizeMediaRequest |
    EditMediaRequest | UpdateUserRequest](context *gin.Context) (T, error) {
    var payload T
    err := context.ShouldBindJSON(&payload)
    return payload, err
}


【问题讨论】:

    标签: go go-gorm go-gin


    【解决方案1】:

    据我所知,您需要明确设置所有参数,并且 Go 中没有与 Python 的 kwargs 类似的内置模拟。
    您可以编写方法,例如mediaPayloadToModel,并在必要时重新使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2021-04-23
      • 2013-07-10
      相关资源
      最近更新 更多