2

Я создал функцию, которая соединяется с сигналом 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().

+0

Что вы действительно пытаетесь достичь? Почему вы играете с обновлением или введением в Django? Существует редко причина беспорядка с pre_save. Что вы на самом деле пытаетесь сделать? –

+1

Я пытаюсь создать SlugField из названия.Если это обновление, я не хочу, чтобы он создавал новый пул. – Matt

+0

@Matt: Обновите свой вопрос новыми фактами. Для этого вам не нужно возиться с pre_save. Переопределить save(). –

ответ

1

S.Lott является правильным ... используйте save(), поскольку вы уже признали, что начали работать.

Что касается вопроса о сигнале, я могу честно не видеть ничего плохого с вашим кодом. Я даже успел запустить его на месте. Вы уверены, что правильно представляете его в вопросе? Или этот экземпляр2 уже не является существующим объектом базы данных (возможно, goof в вашем тестовом коде)?

+0

Я попытался проверить это в оболочке manage.py. Это именно то, что я пробовал: >>> from test.models import Test >>> t1 = Test (title = "test title") >>> t1.save() >>> t1.slug 'а-тест-заголовок' >>> t2 = тест (название = "тест название") >>> t2.save() >>> t2.slug '' – Matt

+0

Ничего себе, это некрасиво. Хм, я просмотрю свой код и посмотрю, допустил ли я ошибку. – Matt

+0

Я только что заметил «prepopulate_from» ... какую версию django вы используете? В противном случае ... что такое код в «Generate Slug Code»? –

0

Спасибо, что разместили это. Лучшие результаты google (в то время, когда я публикую это) немного устарели и показывают старый способ подключения сигналов (который был недавно переписан, по-видимому). Ваши исправления с исправленными фрагментами кода показали мне, как это делается.

Я хочу, чтобы плакаты редактировали свои комментарии, чтобы поместить исправление в него. Благодарю. :-)

Смежные вопросы