Как определить новый объект в пользовательском методе save () модели django?

Гораздо более общее решение для округления до 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
142
задан MikeN 25 May 2009 в 18:45
поделиться

7 ответов

self.pk is None:

возвращает True в новом объекте Model, если только объект не имеет UUIDField в качестве primary_key .

В крайнем случае вам, возможно, придется беспокоиться о том, существуют ли ограничения уникальности для полей, отличных от идентификатора (например, вторичные уникальные индексы для других полей). В этом случае у вас все еще может быть новая запись, но вы не сможете ее сохранить.

189
ответ дан 23 November 2019 в 22:07
поделиться

Это обычный способ.

идентификатор будет указан при первом сохранении в базе данных

1
ответ дан 23 November 2019 в 22:07
поделиться

Проверка self.id предполагает, что id является первичным ключом для модели. Более общий способ - использовать ярлык pk .

is_new = self.pk is None

44
ответ дан 23 November 2019 в 22:07
поделиться

Основная проблема в том, что браузер даже не отправляет запрос с фрагментарной частью. Фрагментная часть разрешается прямо в браузере. Таким образом, он доступен через JavaScript.

В любом случае вы можете разобрать URL-адрес на биты, включая фрагмент, используя parse_url () , но это явно не ваш случай.

Причина, по которой он должен это делать, заключается в том, что вам разрешено устанавливать PK при создании объекта. Хотя это не распространено там, где у вас есть столбец последовательности для первичного ключа, это не относится к другим типам полей первичного ключа.

Если вы действительно хотите знать, что вы должны делать то, что делает O / RM, и посмотрите в база данных.

Конечно, у вас есть конкретный случай в вашем коде, и для него вполне вероятно, что self.pk == None сообщает вам все, что вам нужно знать, но это не общее решение.

38
ответ дан 23 November 2019 в 22:07
поделиться

лучше использовать pk вместо id :

if not self.pk:
  do_something()
4
ответ дан 23 November 2019 в 22:07
поделиться

Чтобы узнать, обновляете ли вы объект (данные) или вставляете его, используйте в форме self.instance.fieldname . Определите чистую функцию в своей форме и проверьте, совпадает ли текущая запись значения с предыдущей, если нет, то вы обновляете ее.

self.instance и self.instance.fieldname сравнить с новым значением

-3
ответ дан 23 November 2019 в 22:07
поделиться

Вы можете просто подключиться к сигналу post_save, который отправляет "created" kwargs, если true, ваш объект был вставлен.

http://docs.djangoproject.com/en/stable/ref/signals/#post-save

10
ответ дан 23 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: