Гораздо более общее решение для округления до N мест
function roundN(num,n){
return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}
console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))
Output
1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346
self.pk is None:
возвращает True в новом объекте Model, если только объект не имеет UUIDField
в качестве primary_key
.
В крайнем случае вам, возможно, придется беспокоиться о том, существуют ли ограничения уникальности для полей, отличных от идентификатора (например, вторичные уникальные индексы для других полей). В этом случае у вас все еще может быть новая запись, но вы не сможете ее сохранить.
Это обычный способ.
идентификатор будет указан при первом сохранении в базе данных
Проверка self.id
предполагает, что id
является первичным ключом для модели. Более общий способ - использовать ярлык pk .
is_new = self.pk is None
Основная проблема в том, что браузер даже не отправляет запрос с фрагментарной частью. Фрагментная часть разрешается прямо в браузере. Таким образом, он доступен через JavaScript.
В любом случае вы можете разобрать URL-адрес на биты, включая фрагмент, используя parse_url () , но это явно не ваш случай.
Причина, по которой он должен это делать, заключается в том, что вам разрешено устанавливать PK при создании объекта. Хотя это не распространено там, где у вас есть столбец последовательности для первичного ключа, это не относится к другим типам полей первичного ключа.
Если вы действительно хотите знать, что вы должны делать то, что делает O / RM, и посмотрите в база данных.
Конечно, у вас есть конкретный случай в вашем коде, и для него вполне вероятно, что self.pk == None
сообщает вам все, что вам нужно знать, но это не общее решение.
лучше использовать pk вместо id :
if not self.pk:
do_something()
Чтобы узнать, обновляете ли вы объект (данные) или вставляете его, используйте в форме self.instance.fieldname
. Определите чистую функцию в своей форме и проверьте, совпадает ли текущая запись значения с предыдущей, если нет, то вы обновляете ее.
self.instance
и self.instance.fieldname
сравнить с новым значением
Вы можете просто подключиться к сигналу post_save, который отправляет "created" kwargs, если true, ваш объект был вставлен.
http://docs.djangoproject.com/en/stable/ref/signals/#post-save