Вы неправильно понимаете, как работает update_or_create
. Вот что говорят документы :
Метод
blockquote>update_or_create
пытается извлечь объект из базы данных на основе заданногоkwargs
. Если совпадение найдено, оно обновляет поля, переданные в словареdefaults
.Таким образом, в
kwargs
вы передаете только те значения, которые вам нужны для соответствия, а не обновления. Вероятно, прохождениеid
илиsymbol
должно быть единственнымkwargs
, что вам нужно. Все параметры, которые вы хотите обновить, должны быть переданы вdefaults
.CryptoPrices.objects.update_or_create( key=exchange_rate['id'], symbol=exchange_rate['symbol'], defaults=dict( market_cap_usd=round(float(exchange_rate['market_cap_usd']), 3), volume_usd_24h=round(float(exchange_rate['24h_volume_usd']), 3), value= round(float(exchange_rate['price_usd']), 3)) )
Вы используете короткозамкнутый или. Если первый аргумент истинен, все выражение истинно.
Это может помочь, если я добавлю неявные скобки, которые использует компилятор
Изменить : Как заметил Крис Джестер-Янг, это на самом деле потому, что логические операторы должны иметь ассоциативность слева направо:
if (func1() || (func2() && func3()))
После возврата func1 это становится следующим:
if (true || (func2() && func3()))
После оценки короткого замыкания или становится:
if (true)
Функции Java оцениваются в соответствии с правилами приоритета
, потому что «&&» имеет более высокий приоритет, чем «||», оно оценивается первым, потому что у вас не было скобок для установите явный приоритет
, чтобы выражение
(A || B && C)
, которое является
(T || F && F)
, было заключено в скобки как
(T || (F && F))
из-за правил приоритета.
Поскольку компилятор понимает, что если 'A == true', ему не нужно беспокоиться об оценке остальной части выражения, он останавливается после вычисления A.
Если вы заключили в скобки ((A || B) && C)
Тогда это будет ложно.
EDIT
Другой способ, как упоминалось в других плакатах, - использовать "|" и "&" вместо "||" и "&&", потому что это останавливает сокращение выражения. Однако из-за правил приоритета конечный результат будет таким же.
Java сокращает логические выражения. Это означает, что после выполнения func1 ()
и возврата true
остальная часть этого логического значения не имеет значения, поскольку вы используете оператор или
. Независимо от того, что вычисляет func2 () && func3 ()
, все выражение будет оцениваться как true
. Таким образом, Java даже не утруждает себя вычислением func2 ()
или func3 ()
.
или
. Независимо от того, что вычисляет func2 () && func3 ()
, все выражение будет оцениваться как true
. Таким образом, Java даже не утруждает себя вычислением func2 ()
или func3 ()
. . остальная часть этого логического значения не имеет значения, поскольку вы используете оператор или
. Независимо от того, что вычисляет func2 () && func3 ()
, все выражение будет оцениваться как true
. Таким образом, Java даже не утруждает себя вычислением func2 ()
или func3 ()
. . Вы используете операторы быстрого доступа || и &&. Эти операторы не выполняют остальную часть выражения, если результат уже определен. Для || это означает, что если первое выражение истинно, а для && если первое выражение ложно.
Если вы хотите выполнить все части выражения, используйте | и вместо этого &, это не ярлык.
Java использует отложенное вычисление.
Поскольку Func1 всегда возвращает истину, все выражение ДОЛЖНО быть истинным, поэтому оно сокращает оставшуюся часть выражения.
true || (???)
и
false && (???)
всегда будут сокращать .
Чтобы отключить оценку быстрого доступа, используйте | и & вместо || и &&
Мы можем использовать это для хорошего эффекта:
String s;
if (s != null && !s.equals("")) ...
Это означает, что если s равно null, нам даже не нужно будет пытаться вызвать s.equals, и мы не выдадим исключение NullPointerException
краткий ответ: оценка короткого замыкания
, поскольку функция func1 () дает истину, нет необходимости продолжать оценку, поскольку она всегда истинна
Если функция 1 всегда возвращает истину, то Java не необходимо оценить остальную часть выражения, чтобы определить, что все выражение будет истинным.
Если вы хотите, чтобы выполнялись все функции, вы можете отказаться от сокращенных вариантов
if (func1() | func2() & func3()) {