Это связано с тем, что sudo pip install numpy
никогда не устанавливал numpy в вашем virtualenv. Не использовать sudo
использовать
python -m pip install numpy
После активации вашей виртуальной среды.
Это более универсальная проблема.
Основное различие заключается в семантике. Вы должны решить, каковы отношения (Какой-то глупый пример):
У человека только одна правая рука. Правая рука принадлежит одному человеку.
Сказать обратное выглядит немного странно:
Правая рука имеет мужчину. Мужчина принадлежит правой руке.
Вы можете иметь человека без правой руки. Но одна правая рука бесполезна.
В дальнейшем, если RightArm и Men являются моделями, это может выглядеть следующим образом:
Man.hasOne(RightArm);
RightArm.belongsTo(Man);
И, как вы заметили, есть также разница в структуре таблицы БД:
BelongsTo будет добавить foreignKey к источнику, куда hasOne добавит к цели (Sequelize создает новый столбец «ManId» в таблице «RightArm», но не создает столбец «RightArmId» в таблице «Man»).
Я не вижу больше различий.
Я согласен с Кшиштофом Штомпкой о разнице между:
Man.hasOne(RightArm);
RightArm.belongsTo(Man);
Я хотел бы ответить на вопрос Янцзюнь Вана :
Итак, в этом случае я должен использовать
Man.hasOne(RightArm);
илиRightArm.belongsTo(Man);
? Или использовать их обоих?
Это правда, что отношения Man.hasOne(RightArm);
и RightArm.belongsTo(Man);
делают одно и то же - каждое из этих отношений добавит внешний ключ manId
к RightArm
. ] таблица.
С точки зрения физического уровня базы данных эти методы делают то же самое, и для нашей базы данных не имеет значения, какой именно метод мы будем использовать.
1147 Так в чем же разница? Основное различие лежит на слое ORM (в нашем случае это Sequalize ORM, но приведенная ниже логика применима к Eloquent ] ORM Ларавела или даже к активной записи Руби ОРМ).
Используя отношение Man.hasOne(RightArm);
, мы сможем заполнить человека RightArm
, используя модель Man
. Если этого достаточно для нашего приложения, мы можем остановиться на этом и не добавлять отношение RightArm.belongsTo(Man);
к модели RightArm
.
Но что, если нам нужно получить владельца RightArm
? Мы не сможем сделать это, используя модель RightArm
без определения отношения RightArm.belongsTo(Man);
для модели RightArm
.
Еще одним примером будут модели User
и Phone
. Определив отношение User.hasOne(Phone)
, мы сможем заполнить наши User
Phone
. Без определения отношения Phone.belongsTo(User)
мы не сможем заполнить владельца Phone
(например, нашего User
). Если мы определим отношение Phone.belongsTo(User)
, мы сможем получить владельца Phone
.
Итак, здесь мы имеем главное отличие: если мы хотим иметь возможность заполнять данные из обеих моделей, нам нужно определить отношения (hasOne
и belongsTo
) для обеих из них. Если нам достаточно получить, например, только User
[1128], но не User
Phone
, мы можем определить только отношение User.hasOne(Phone)
для модели User
.
Приведенная выше логика применяется ко всем ORM, которые имеют отношения hasOne
и belongsTo
.
Надеюсь, это прояснит ваше понимание.