Это зависит от вашей ситуации. Если вы не используете метод менеджера , тогда using()
хорошо, в противном случае вам понадобится db_manager()
.
Вы можете выбрать базу данных для
blockquote>QuerySet
в любой точке «цепочки»QuerySet
. Просто вызовитеusing()
наQuerySet
, чтобы получить другуюQuerySet
, которая использует указанную базу данных.Но если вам нужно использовать методы менеджера, это не сработает.
Следующее объяснение взято из документов :
Скажем, у вас есть собственный метод менеджера, который касается базы данных -
User.objects.create_user()
. Посколькуcreate_user()
является методом менеджера, а не методомQuerySet
, вы не можете сделатьUser.objects.using('another_db').create_user()
. Методcreate_user()
доступен только дляUser.objects
менеджера, но не дляQuerySet
объектов, полученных от менеджера. Решение состоит в том, чтобы использоватьdb_manager()
, например так:User.objects.db_manager('another_db').create_user(...)
db_manager()
возвращает копию менеджера, привязанного к указанной вами базе данных.
Документировано, что Integer.toHexString
возвращает строковое представление целого числа как беззнаковое значение, тогда как Integer.parseInt
принимает целое число со знаком. Если вы вместо этого используете Integer.toString (value, 16)
, вы получите то, что хотите.
Вам необходимо включить отрицательный знак .
У меня нет доступа, чтобы проверить это прямо сейчас, но я готов поспорить, если бы вы вместо этого попробовали это значение:
Integer min = Integer.MIN_VALUE + 1;
Он не будет бомбить, но даст положительное число (не отрицательное), когда вы запустите ParseInt (min, 16)
.
строка битов не На самом деле недостаточно информации для определения знака в этом контексте, поэтому вам необходимо ее предоставить. (рассмотрим случай, когда вы используете min = "F"
. Это +/- F? Если вы преобразовали его в биты и увидели 1111, и , вы знали, что это байт, вы можете сделать вывод, что это отрицательно, но это много «если».
Try this:
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseInt( "-" + minHex, 16));
}
}
to get this:
-2147483648 80000000
-2147483648
This is something that's always annoyed me. If you initialize an int with a hex literal, you can use the full range of positive values up to 0xFFFFFF
; anything larger than 0x7FFFFF
will really be a negative value. This is very handy for bit masking and other operations where you only care about the locations of the bits, not their meanings.
But if you use Integer.parseInt() to convert a string to an integer, anything larger than "0x7FFFFFFF"
is treated as an error. There's probably a good reason why they did it that way, but it's still frustrating.
The simplest workaround is to use Long.parseLong() instead, then cast the result to int.
int n = (int)Long.parseLong(s, 16);
Of course, you should only do that if you're sure the number is going to be in the range Integer.MIN_VALUE..Integer.MAX_VALUE
.