Связано с администратором qor

У меня есть эти две структуры:

type Collection struct {
    gorm.Model
    APIKey       string
    CollectionID string
    Name         string
    Environments []Environment
}
type Environment struct {
    gorm.Model
    EnvironmentID string
    Name          string
    Provider      string
    FlightType    string
    ADT           int
    CHD           int
    INF           int
}

А главное выглядит так:

func main() {
    adminResource := admin.New(&admin.AdminConfig{DB: model.DB})
    adminResource.AddResource(&model.Collection{})
    adminResource.AddResource(&model.Environment{})

    mux := http.NewServeMux()
    adminResource.MountTo("/admin", mux)

    if err := http.ListenAndServe(":8000", mux); err != nil {
        panic(err)
    } else {
        fmt.Println("Listening on: 8000")
    }
}

Дело в том, что я не знаю, следует ли мне делать что-то еще, чтобы разрешить отношения членства «один ко многим» между Коллекцией и Environemt. Дело в том, что форма в панели администратора выглядит хорошо, я могу добавить столько сред, сколько было ... но отправив форму только Collection сохраняются в базе данных.

Вы установили какие-либо отношения между вашими двумя моделями? godoc.org/github.com/jinzhu/gorm#Relationship

apxp 10.08.2018 09:25

Привет @apxp, я пытался это сделать: db.Model(&Collection).Related(&Environment). Я пытался использовать в качестве аргументов структуры Collection и Environments, но эти функции ориентированы на экземпляр. И Я не знаю где это сделать, потому что обработкой форм управляет qor. Есть ли способ добавить промежуточное ПО (или что-то еще) в загрузку Коллекции ??

Eloy Fernández Franco 10.08.2018 10:20
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
386
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не хватает того, чтобы сообщить gorm внешний ключ другой модели.

В вашем случае мы используем Есть много (Горм Док). Чтобы определить отношения, вам нужно добавить тег в свою структуру:

type Collection struct {
    gorm.Model
    APIKey       string
    CollectionID string
    Name         string
    Environments []Environment `gorm:"foreignkey:EnvironmentID"`
}
type Environment struct {
    gorm.Model
    EnvironmentID string
    Name          string
    Provider      string
    FlightType    string
    ADT           int
    CHD           int
    INF           int
}

Без определения внешнего ключа другой модели gorm не может сопоставить эти обе модели. Поскольку соглашение для первичного ключа - это ID, а ваш Enviroment не имеет этого поля, сопоставить что-либо невозможно. Обязательно прочтите документацию по условности.

Еще раз привет @apxp Похоже, начинает работать ... но я обнаружил пару новых проблем: 1) Администратор не позволяет редактировать EnvironmentID (а это необходимо). Решение: Environments []Environment `gorm:"foreignkey:ID"`. 2) Это решение создает новую проблему: в БД сохраняется только последняя среда, при попытке добавить новую, последняя редактирует предыдущую, вместо этого вставляет новую среду. 3) Я пытаюсь сделать это (в структуре env): ID uint `gorm:"primary_key" sql:"AUTO_INCREMENT"` Но добавляя больше, чем env, я получаю: pq: дублирующийся ключ нарушает ограничение уникальности «environment_pkey»

Eloy Fernández Franco 11.08.2018 11:46
Ответ принят как подходящий

Наконец я нашел решение.

type Collection struct {
    gorm.Model
    APIKey       string
    CollectionID string
    Name         string
    Environments []Environment
}
type Environment struct {
    gorm.Model
    EnvironmentID string
    Name          string
    Provider      string
    FlightType    string
    ADT           int
    CHD           int
    INF           int
    CollectionID  int
}

Достаточно добавить CollectionID int в структуру Environment ... очень просто: D.

Спасибо @apxp

Другие вопросы по теме