Я создал функцию, которая соединяется с сигналом pre_save модели. Внутри функции я пытаюсь проверить, если рк экземпляра модели уже существует в таблице с:Django Model.object.get pre_save Функция Weirdness
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()
Это мой третий день возиться с питоном и Джанго. Поэтому я сожалею, если это что-то новенькое, чего я не вижу.
Edit:
Модель:
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 сказал мне, чтобы переопределить метод сохранения() в комментариях. Я должен попробовать это. Я все равно хотел бы знать, почему второй вызов model.objects.get() не вызывает ошибку с помощью этого метода.
Редактировать 2 Спасибо @ S.Lot. Переопределение метода сохранения отлично работает. Все еще интересуется сигнальным методом. Хм, странно.
Edit 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().
Что вы действительно пытаетесь достичь? Почему вы играете с обновлением или введением в Django? Существует редко причина беспорядка с pre_save. Что вы на самом деле пытаетесь сделать? –
Я пытаюсь создать SlugField из названия.Если это обновление, я не хочу, чтобы он создавал новый пул. – Matt
@Matt: Обновите свой вопрос новыми фактами. Для этого вам не нужно возиться с pre_save. Переопределить save(). –