Что состоит в том, чтобы узнать канонический путь, сохраняется ли модель Django к дб?

Я обычно проверяю if obj.pk к knwo, если объекты сохраняется. Эта работа привычки однако, если Вы имеете primary_key = True набор на некоторых полях. Например, я установил user = models.OneToOneField(User, primary_key=True) на моем UserProfile.

Что состоит в том, чтобы узнать канонический путь, сохраняется ли модель Django к дб?

39
задан John Meagher 10 January 2010 в 15:26
поделиться

1 ответ

Важное примечание (по состоянию на 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 = . Однако будьте осторожны, вы можете создавать неопределенное поведение, если вы переопределите свойство на чужой экземпляр модели, который вы импортируете.

35
ответ дан 27 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

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