Как указывалось в других ответах, Article
ForeignKey требуется для вашей модели ArticleStat
, и сохранение автоматически завершится неудачно без действительного экземпляра Article.Лучший способ избежать неудачи из-за неверного ввода - использовать проверку Form
с API форм Django .Или при обработке сериализованных данных с помощью Django Rest Framework, используя Serializer
, который является аналогом формы для данных JSON.Таким образом, вам не нужно перезаписывать метод save
, если у вас нет особых требований.
Пока никто не упомянул правильное использование .exists().
Это метод queryset , а не экземпляр модели , поэтому вы получаете ошибку, которую выупоминалось выше при попытке применить его к отдельному экземпляру модели с помощью self.article.exists()
.Чтобы проверить существование объекта, просто используйте .filter
вместо .get
.Если ваша статья (pk=1
) существует, то:
Article.objects.filter(pk=1)
вернет набор запросов с одной статьей:
<Queryset: [Article: 1]>
и
Article.objects.filter(pk=1).exists()
Willвозврат True
.Принимая во внимание, что если элемент не существует, запрос возвратит пустой набор запросов и .exists()
вернет False
, а не вызовет исключение (как попытка .get()
несуществующего объекта).Это по-прежнему применимо, если pk
ранее существовал и был удален.
РЕДАКТИРОВАТЬ: Только что заметил, что ваше поведение ArticleStat
on_delete
в настоящее время установлено на CASCADE
.Это означает, что при удалении статьи соответствующая статья также удаляется.Поэтому я думаю, что вы, вероятно, неправильно истолковали ошибки / трудности, о которых вы упоминали в ответ на ответ @ jonah-bishop при попытке if self.article:
.Для минимального исправления, если вы все еще хотите сохранить ArticleStat после удаления статьи, измените ключевое слово on_delete
на models.SET_NULL
и, согласно ответу Джоны, добавьте дополнительные ключевые слова null=True, blank=True
:
article = models.ForeignKey(Article, on_delete=models.SET_NULL, related_name='articlestats', null=True, blank=True)
Тогда не должно возникнуть никаких проблем, если просто выполнить if self.article:
для проверки правильности отношения объекта ForeignKey.Однако использование форм / сериализаторов все же лучше.