beego中struct中有field是slice类型怎么存储?

type Article struct{
    Title string
    Content string
    Author []string
}

o:= orm.NewOrm()
o.insert(&a)//a:=Article{...}

这样会报错:

field: Article.Author, unsupport field type [], may be miss setting tag

我知道可以把tag设置成string类型,然后将[]string,json编码一下,这样可以存储,但是取出来渲染模板的时候就比较麻烦了。想问大家有什么好办法可以存储吗?或者beego orm本身就可以设置tag来存储,不过在官网上找了下没找到,请大家告诉一下。

已邀请:

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: woshizilong jangta jeffSheng

Author 是一个[]string类型对吧,这个的话你只能定义一个自己的类型了, 任何的类型只要实现了orm.Fielder的interface的字段都可以了。

// A slice string field.
type SliceStringField []string

func (e SliceStringField) Value() []string {
    return []string(e)
}

func (e *SliceStringField) Set(d []string) {
    *e = SliceStringField(d)
}

func (e *SliceStringField) Add(v string) {
    *e = append(*e, v)
}

func (e *SliceStringField) String() string {
    return strings.Join(e.Value(), ",")
}

func (e *SliceStringField) FieldType() int {
    return TypeCharField
}

func (e *SliceStringField) SetRaw(value interface{}) error {
    switch d := value.(type) {
    case []string:
        e.Set(d)
    case string:
        if len(d) > 0 {
            parts := strings.Split(d, ",")
            v := make([]string, 0, len(parts))
            for _, p := range parts {
                v = append(v, strings.TrimSpace(p))
            }
            e.Set(v)
        }
    default:
        return fmt.Errorf("<SliceStringField.SetRaw> unknown value `%v`", value)
    }
    return nil
}

func (e *SliceStringField) RawValue() interface{} {
    return e.String()
}

jeffSheng

赞同来自:

不知道你解决了没有,我实现了这个orm.fielder不过还是貌似报错!

field: models.Menu.SMenus, unsupport field type [], may be miss setting tag

/*************实现orm.fielder***********************/
type CustomMenuSlice []*Menu

func (e CustomMenuSlice) Value() []*Menu {
    return []*Menu(e)
}

func (e *CustomMenuSlice) Set(d []*Menu) {
    *e = CustomMenuSlice(d)
}
func (e *CustomMenuSlice) Add(v *Menu) {
    *e = append(*e, v)
}

func (e CustomMenuSlice) String() []*Menu {
    return []*Menu(e)
}
func (c CustomMenuSlice) FieldType() int {
    return orm.IsFieldType
}
func (e *CustomMenuSlice) SetRaw(value interface{}) error {
    switch d := value.(type) {
    case []*Menu:
        e.Set(d)
    default:
        return fmt.Errorf("<SliceStringField.SetRaw> unknown value `%v`", value)
    }
    return nil
}

func (e *CustomMenuSlice) RawValue() interface{} {
    return e.String()
}

/************************************/
//菜单
type Menu struct {
    Id       int64
    MenuName string
    Url      string
    ParentId int64
    Sort     int16
    SMenus   CustomMenuSlice
}

jeffSheng

赞同来自:

解决了,这样子就行了

type Menu struct {
    Id       int64
    MenuName string
    Url      string
    ParentId int64
    Sort     int16
    SMenus   []*Menu `orm:"-"`
}

要回复问题请先登录注册