Я сделал функцию, которая подключается к сигналу модели pre_save. Внутри функции я пытаюсь проверить, существует ли pk экземпляра модели в таблице с:
sender.objects.get(pk=instance._get_pk_val())
Первый экземпляр модели вызывает ошибку. Я улавливаю ошибку и генерирую поле заголовка из заголовка. Во втором случае это не выдает ошибку. Я проверил значение instance._get_pk_val () в обоих экземплярах, и они одинаковы: Нет
Итак:
# This one raises an error in the sluggit function
instance1 = Model(title="title 1")
instance1.save()
# This one doesn't raise an error
instance2 = Model(title="title 2")
instance2.save()
Это мой третий день возни с питоном и джанго. Поэтому мне жаль, если это что-то новенькое, чего я не вижу.
Редактировать:
Модель:
class Test(models.Model):
title = models.CharField(max_length=128)
slug = models.SlugField(max_length=128)
slug.prepopulate_from=('title',)
signals.pre_save.connect(package.sluggit, sender=Test)
Основы функций:
def sluggit(sender, instance, signal, *args, **kwargs):
try:
sender.objects.get(pk=instance._get_pk_val())
except:
# Generate Slug Code
@S.Lot сказал мне переопределить метод save () в комментариях. Я должен попробовать это. Я все еще хотел бы знать, почему второй вызов model.objects.get () не вызывает ошибку с этим методом.
Редактировать 2
Спасибо @ S.Lot. Переопределение метода сохранения работает отлично. Все еще любопытно о методе сигнала. Хм, странно.
Редактировать 3
Поиграв немного больше, я обнаружил, что использование instance.objects.get () вместо sender.objects.get () работает:
def sluggit(sender, instance, signal, *args, **kwargs):
try:
sender.objects.get(pk=instance._get_pk_val())
except:
# Generate Slug Code
должно быть:
def sluggit(sender, instance, signal, *args, **kwargs):
try:
instance.objects.get(pk=instance._get_pk_val())
except:
# Generate Slug Code
ошибка? По какой-то причине я думал, что sender.objects.get () будет таким же, как Test.objects.get ().