Я обычно проверяю if obj.pk
к knwo, если объекты сохраняется. Эта работа привычки однако, если Вы имеете primary_key = True
набор на некоторых полях. Например, я установил user = models.OneToOneField(User, primary_key=True)
на моем UserProfile
.
Что состоит в том, чтобы узнать канонический путь, сохраняется ли модель Django к дб?
Важное примечание (по состоянию на 6 мая '19): если ваши модели используют UUID поля (или другой метод генерации внутреннего идентификатора, используйте Self._state.Ading
Как уже упоминалось в комментариях.
На самом деле obj.pk
является наиболее каноническим способом. Сам Джанго часто не «знает», если объект сохранен или нет. Согласно Ссылка экземпляра модели Django , если есть набор первичного ключа уже, он проверяет Сохранить ()
вызовы, выбрав для идентификатора в базе данных перед любой вставкой.
Даже если вы установите User = Models.oneToonefield (..., Primary_key = True)
Атрибут .pk
все еще будет указывать на правильную первичную клавишу (скорее всего user_id
), а вы Можно использовать его и установить его, как будто это было одно и то же свойство.
Если вы хотите знать после сохранения объекта, вы можете поймать сигнал Post_save . Этот сигнал уволен на модели сохранения, И если вы хотите, вы можете добавить свое собственное приложение Специфический атрибут модели, например obj.was_saved = true
. Я думаю, что Django избегает этого, чтобы держать свои случаи чистыми, но нет никакой настоящей причины, почему вы не могли сделать это для себя. Вот минимальный пример:
from django.db.models.signals import post_save
from myapp.models import MyModel
def save_handler(sender, instance, **kwargs):
instance.was_saved = True
post_save.connect(save_handler, sender=MyModel)
Вы можете поочередно иметь эту функцию работать в всех моделей в вашем приложении, просто подключив сигнал без указания аргумента ARDER =
. Однако будьте осторожны, вы можете создавать неопределенное поведение, если вы переопределите свойство на чужой экземпляр модели, который вы импортируете.